Gestaltung von Kooperationsmodulen für Ruby on Rails

Transcription

Gestaltung von Kooperationsmodulen für Ruby on Rails
Gestaltung von Kooperationsmodulen für
Ruby on Rails
Bachelorarbeit
Vorgelegt von:
Bernd Biedermann
Matr. Nr: 6983499
Ausgefertigt am:
Lehrgebiet Kooperative Systeme
FernUniversität in Hagen
Eingereicht bei:
Dr. Till Schümmer
Juni 2009
Gestaltung von Kooperationsmodulen für Ruby on Rails
Hiermit versichere ich, dass ich diese Arbeit selbstständig verfasst, und keine anderen,
als die angegebenen Quellen und Hilfsmittel benutzt, sowie Zitate kenntlich gemacht
habe.
Alle zitierten Internetseiten beziehen sich, so nicht anders angegeben, auf die
Versionen des Monats Mai 2009.
Alle Bilder, die mit keiner Quellenangabe versehen sind, wurden vom Verfasser selbst
erstellt.
Hohenems, 15.6.2009
2009-09-10
Bernd Biedermann
2/107
Gestaltung von Kooperationsmodulen für Ruby on Rails
Inhaltsverzeichnis
Gestaltung von Kooperationsmodulen für Ruby on Rails ............................................. 1 1 Einleitung ............................................................................................................... 7 1.1 Motivation ....................................................................................................... 7 1.2 Aufgabenstellung ............................................................................................ 8 1.3 Übersicht ......................................................................................................... 8 2 Anforderungsanalyse ........................................................................................... 10 2.1 Webbasierte Groupware Anwendungen........................................................ 10 2.2 Analyse der Entwurfsmuster ......................................................................... 12 2.2.1 Groupware und Group Awareness ......................................................... 12 2.2.2 Entwurfsmuster ...................................................................................... 12 2.2.3 Ermittlung der wichtigsten Entwurfsmuster .......................................... 13 2.3 Einzelne Module ........................................................................................... 22 2.4 Elemente sollen sich nahtlos in die Rails Architektur einbinden lassen ....... 23 2.5 Verwendbarkeit ............................................................................................. 24 2.6 Konfigurierbarkeit ......................................................................................... 25 2.7 Codebasis ...................................................................................................... 26 2.8 Zusammenfassung der Anforderungen ......................................................... 26 3 State of the Art ..................................................................................................... 27 3.1 Untersuchung von existierenden Plug-Ins..................................................... 27 3.1.1 Plug-Ins für Synchrone Zusammenarbeit .............................................. 27 3.1.2 Andere Plug-Ins ..................................................................................... 29 3.1.3 Zusammenfassung.................................................................................. 31 3.2 Untersuchung von Open Source Anwendungen ........................................... 32 3.3 Eignung und Defizite bestehender Lösungen für Module ............................ 35 3.4 Fazit ............................................................................................................... 35 4 Beschreibung der Lösungsidee ............................................................................ 36 4.1 Gesamtkonzept und Aufbau der Anwendung, Plug-Ins ................................ 36 4.2 Umsetzung der Entwurfsmuster in Plug-Ins ................................................. 37 4.3 Verwendbarkeit ............................................................................................. 38 4.4 Konfigurierbarkeit ......................................................................................... 39 4.5 Synchronizität................................................................................................ 40 4.6 Modelle.......................................................................................................... 40 5 Details zur Lösung ............................................................................................... 42 5.1 Allgemein ...................................................................................................... 42 5.2 Realisierung der Entwurfsmuster .................................................................. 43 5.2.1 Basisprojekt (Quick Registration, Login, Quick Goodbye) ............. 43 5.2.2 Plug-In cmi_virtual_me (Virtual Me, Availability Status) ................ 45 5.2.3 Plug-In cmi_user_gallery (User Gallery) ............................................. 50 5.2.4 Plug-In cmi_buddy_list (Buddy List, Spontaneous Collaboration) . 52 5.2.5 Plug-In Simple Groups (Group) .............................................................. 56 5.2.6 Plug-In Attachment Fu (Shared File Repository) ............................... 57 5.2.7 Plug-In cmi_room (Room, Bell, Invitation, Spontaneous Collaboration,
User List, Interaction Directory) .......................................................................... 58 5.2.8 Plug-In cmi_message ............................................................................. 62 5.2.9 Plug-In cmi_embedded_chat (Embedded Chat).................................. 64 5.2.10 Plug-In cmi_juggernaut_connection ...................................................... 67 5.2.11 Plug-In cmi_interactive_user_info (Interactive User Info) ................ 68 5.2.12 Plug-In acts_as_versioned (Immutable Versions, Activity Log) ....... 70 2009-09-10
3/107
Gestaltung von Kooperationsmodulen für Ruby on Rails
5.2.13 Plug-In cmi_coll_session (Collaborative Session, User List) ........... 72 5.2.14 Plug-In cmi_remote_subscription (Remote Subscription)..................... 74 5.2.15 Plug-In Juggernaut (Mediated Updates) ............................................. 76 5.3 Weitere Plug-Ins ............................................................................................ 77 5.3.1 Plug-In cmi_user_avatar ........................................................................ 77 5.3.2 Plug-In demo_bike_guide ...................................................................... 79 5.3.3 Plug-In Restful Authentication .............................................................. 80 5.3.4 Plug-In acts_as_state_machine .............................................................. 81 5.3.5 Plug-In Rails Widgets (Tooltips) ........................................................... 83 5.4 Eine Anwendung erstellen ............................................................................ 84 6 Zusammenfassung.............................................................................................. 100 6.1 Wie wurde die Aufgabenstellung gelöst?.................................................... 100 6.2 Ausblick ...................................................................................................... 101 7 Quellenverzeichnis ............................................................................................. 102 2009-09-10
4/107
Gestaltung von Kooperationsmodulen für Ruby on Rails
Abbildungsverzeichnis
Abb. 1: Kategorien von Webanwendungen (Kappel et al 2004, S. 7) ......................... 10 Abb. 2: Hauptbestandteile von Groupware und deren ................................................. 12 Abb. 3: CURE Login Screen ....................................................................................... 14 Abb. 4: Google Docs, Documents ............................................................................... 14 Abb. 5: Facebook Login Screen................................................................................... 15 Abb. 6: ebay Produktsuche (Quelle: http://www.ebay.com/) ...................................... 15 Abb. 7: Skype (Version 3.8.0.188) .............................................................................. 16 Abb. 8: El Dorado, Demo Seite (Quelle: http://eldoradoapp.com/) ............................ 16 Abb. 9: Thetis Demo, Desktop (Quelle: http://sysphonic.com/thetis/) ........................ 17 Abb. 10: eXPlain PMT, Dashboard (Version: 20070423.0) ........................................ 17 Abb. 11: Boxroom Folder ............................................................................................ 18 Abb. 12: Entwurfsmuster und deren Beziehungen zueinander (Vorauswahl) ............. 20 Abb. 13: Model, View, Controller ............................................................................... 23 Abb. 14: Klassen und Tabellen .................................................................................... 24 Abb. 15: Plug-Ins ......................................................................................................... 38 Abb. 16: Modelle und deren Beziehungen zueinander ................................................ 41 Abb. 17: Basisprojekt Abhängigkeiten ........................................................................ 43 Abb. 18: cmi_virtual_me Abhängigkeiten ................................................................... 45 Abb. 19: Virtual Me mit aufgeklapptem Tooltip und Edit user data ........................... 47 Abb. 20: Availability Status ......................................................................................... 48 Abb. 21: Availability State Zustandsdiagramm ........................................................... 49 Abb. 22: cmi_user_gallery Abhängigkeiten ................................................................ 50 Abb. 23: User Gallery mit geöffnetem Tooltip ............................................................ 52 Abb. 24: cmi_buddy_list Abhängigkeiten ................................................................... 53 Abb. 25: Buddy List mit geöffnetem Tooltip .............................................................. 54 Abb. 26: Buddy List Zustandsdiagramm ..................................................................... 55 Abb. 27: Attachment Fu Abhängigkeiten .................................................................... 57 Abb. 28: cmi_room Abhängigkeiten............................................................................ 59 Abb. 29: Manage Rooms ............................................................................................. 61 Abb. 30: User List ........................................................................................................ 61 Abb. 31: CmiRoom Zustandsdiagramm ...................................................................... 62 Abb. 32: cmi_message Abhängigkeiten ...................................................................... 63 Abb. 33: Message Board aufgeklappt mit Anzeige einer neuen Nachricht ................. 64 Abb. 34: cmi_embedded_chat Abhängigkeiten ........................................................... 65 Abb. 35: Chat Board mit aufgeklapptem Tooltip ........................................................ 67 Abb. 36: cmi_interactive_user_info Abhängigkeiten .................................................. 69 Abb. 37: cmi_coll_session Abhängigkeiten ................................................................ 72 Abb. 38: Session State View ........................................................................................ 73 Abb. 39: cmi_remote_subscription Abhängigkeiten ................................................... 74 Abb. 40: Erstellen einer Remote Subscription ............................................................. 75 Abb. 41: cmi_user_avatar Abhängigkeiten.................................................................. 77 Abb. 42: Restful Authentication Abhängigkeiten ........................................................ 80 Abb. 43: acts_as_state_machine Nonprofit (Quelle:
http://www.ibm.com/developerworks/java/library/j-cb03137/figure1.gif ) ................ 82 Abb. 44: Login Screen von CURE und Zugang zu CURE beantragen ....................... 84 Abb. 45: Login Screen und Signup (Zugang beantragen) von Cooperation................ 85 Abb. 46: Schritt 1: Modelle und Beziehungen............................................................. 85 2009-09-10
5/107
Gestaltung von Kooperationsmodulen für Ruby on Rails
Abb. 47: Benutzerprofil editieren in CURE ................................................................ 86 Abb. 48: CMI Plug-In Virtual Me mit aufgeklapptem Tooltip ................................... 86 Abb. 49: Schritt 2: Modelle und Beziehungen............................................................. 87 Abb. 50: Buddy-Liste in CURE ................................................................................... 88 Abb. 51: CMI Buddy List ............................................................................................ 88 Abb. 52: Schritt 3: Modelle und Beziehungen............................................................. 89 Abb. 53: Raum und Seite in CURE ............................................................................. 90 Abb. 54: CMI Room .................................................................................................... 91 Abb. 55: Schritt 4: Modelle und Beziehungen............................................................. 91 Abb. 56: Seite in CURE im Edit Mode ........................................................................ 92 Abb. 57: CMI Room mit Inhalt.................................................................................... 93 Abb. 58: Schritt 5: Modelle und Beziehungen............................................................. 94 Abb. 59: Mailing List in CURE ................................................................................... 95 Abb. 60: CMI Message Board ..................................................................................... 95 Abb. 61: Schritt 6: Modelle und Beziehungen............................................................. 97 Abb. 62: User List in CURE, Quelle:(Schümmer 2006, S. 13) ................................... 98 Abb. 63: CMI User List und Collaborative Session State ........................................... 98 Abb. 64: Schritt 7: Modelle und Beziehungen............................................................. 99 Tabellenverzeichnis
Tabelle 1: Ergebnis der Untersuchung nach der Vorauswahl ...................................... 19 Tabelle 2: Auswahl der zu implementierenden Entwurfsmuster ................................. 21 Tabelle 3: CanHasChat (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt) .......................... 27 Tabelle 4: ActiveMessaging (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt) .................. 28 Tabelle 5: Juggernaut (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt)............................. 29 Tabelle 6: Restful Authentication (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt) .......... 29 Tabelle 7: Simple Groups (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt) ...................... 30 Tabelle 8: Attachment Fu (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt) ...................... 31 Tabelle 9: acts_as_versioned (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt) ................. 31 Tabelle 10: El Dorado .................................................................................................. 32 Tabelle 11: Thetis ........................................................................................................ 33 Tabelle 12: eXPlain PMT ............................................................................................ 34 Tabelle 13: Boxroom ................................................................................................... 34 Tabelle 14: Implementierte Entwurfsmuster ............................................................... 37 Tabelle 15: Konfigurationsmöglichkeiten der Plug-Ins ............................................... 40 2009-09-10
6/107
Einleitung
1 Einleitung
1.1 Motivation
Das Web 1 gewinnt immer mehr an Bedeutung, sei es im Alltag, im Geschäftsleben,
oder in der Weiterbildung. In (Kappel et al 2004, S. 1) wird die Ursache für diese
Tendenz wie folgt begründet:
"Der Grund für diese Omnipräsenz liegt insbesondere in der Natur des Web,
die gekennzeichnet ist durch globale und permanente Verfügbarkeit sowie
komfortablen und einheitlichen Zugriff auf beliebig verteilte, von jedermann
erstellbare Informationen in Form von Webseiten."
Nicht zuletzt aufgrund dieser ständigen Verfügbarkeit entwickelte sich aus einem zum
großen Teil aus relativ statischen html-Seiten bestehende Web das Web 2.0, das
(O'Reilly 2006) so beschreibt:
"Web 2.0 is the business revolution in the computer industry caused by the
move to the Internet as a platform, and an attempt to understand the rules for
success on that new platform."
Diese Entwicklung des Webs hin zu einer Plattform hat zur Folge, dass der Bedarf für
Groupware-Anwendungen 2 ständig steigt.
Das Web-Framework Ruby on Rails 3 ist aufgrund seiner Flexibilität, seiner
Erweiterbarkeit und seiner einfachen Handhabung sehr gut für die Entwicklung eines
Web-basierten kollaborativen Systems geeignet. Für das Framework steht eine große
Zahl von Plug-Ins 4 bereit, die Rails auf viele verschiedene Arten erweitern, und auf
die für die Entwicklung eines kollaborativen Systems zurückgegriffen werden kann.
1
Web, World Wide Web, WWW: Jacobs (2004) definiert den Begriff Web folgendermaßen: "An
information space in which items of interest are identified by Uniform Resource Identifiers."
Neu eingeführte und wichtige Begriffe sowie Dateinamen und Links sind in dieser Arbeit kursiv
geschrieben.
2
Eine Groupware Anwendung (oder ein kollaboratives System) wird von Peter and Trudy JohnsonLenz (1990) wie folgt definiert: “intentional group processes plus software to support them.”
3
Ruby on Rails (kurz RoR, Rails) ist ein Web Development Framework, das in der
Programmiersprache Ruby geschrieben wurde, siehe auch (Hansson 2003).
4
Fowler (2003, S. 499) beschreibt das Entwurfsmuster Plugin folgendermaßen:" Links classes during
configuration rather than compilation." Vereinfacht gesagt stellt eine Host Application eine
Schnittstelle zur Verfügung, über die ein anderes Programm (das Plugin) an den Host angedockt
werden kann, ohne dass der Host bzw. das Plugin geändert werden müssen.
2009-09-10
7/107
Einleitung
1.2 Aufgabenstellung
Im Buch Patterns for Computer-Mediated Interaction (Schümmer und Lukosch 2007)
beschreiben Till Schümmer und Stephan Lukosch in Form von Entwurfsmustern 5 die
Bestandteile von kooperativen Systemen.
Ziel dieser Arbeit ist es, die wichtigsten Entwurfsmuster für ein kooperatives System
aus diesem Buch zu ermitteln, und diese mit Hilfe des Web-Frameworks Ruby on
Rails als Module zu realisieren, sodass sich die kooperativen Elemente nahtlos in die
Ruby on Rails Architektur einbinden lassen.
Es soll eine Bibliothek aus Modulen entstehen, die sich einfach und flexibel
verwenden lassen.
1.3 Übersicht
Diese Arbeit gliedert sich in vier Bereiche, welche zur Einleitung überblicksartig
dargestellt werden.
Anforderungsanalyse
In diesem Abschnitt wird zunächst die Problematik der Entwicklung von
Webanwendungen 6 kurz angerissen, danach wird auf die Entwurfsmuster näher
eingegangen, wobei ein zentraler Punkt die Auswahl der zu implementierenden
Entwurfsmuster darstellt. Zu diesem Zweck wurde eine Studie durchgeführt, in der
mehrere Anwendungen dahingehend untersucht wurden, ob bzw. welche
Entwurfsmuster in den untersuchten Anwendungen umgesetzt wurden.
Nach der Auswahl der zu implementierenden Entwurfsmuster werden weitere
Anforderungen an die zu implementierenden Module diskutiert.
State of the Art
In diesem Kapitel werden verfügbare Anwendungen und Plug-Ins in Bezug auf ihre
Eignung für die Umsetzung der Aufgabenstellung hin untersucht. Für die
Untersuchung werden die in der Anforderungsanalyse erarbeiteten Kriterien
herangezogen.
5
Nach (Winter 2005, S. 356) ist ein Entwurfsmuster (kurz Muster) in der Softwareentwicklung
allgemein eine Beschreibung einer Familie von Lösungen für ein Entwurfsproblem.
Diese Arbeit bezieht sich hauptsächlich auf die Entwurfsmuster aus (Schümmer und Lukosch 2007).
6
Eine Webanwendung (Webbasierte Anwendung) ist ein Softwaresystem, das auf Spezifikationen des
World Wide Web Consortium (W3C) beruht, und Web-spezifische Ressourcen wie Inhalte und Dienste
bereitstellt, die über eine Benutzerschnittstelle, den Webbrowser, verwendet werden. (Kappel et al
2004)
2009-09-10
8/107
Einleitung
Beschreibung der Lösungsidee
Nachdem der Stand der Technik und die Defizite aktueller Anwendungen und PlugIns ermittelt wurden, wird eine Lösungsidee für die Umsetzung vorgestellt. Es wird
gezeigt, wie die Anforderungen, die sich in der Anforderungsanalyse
herauskristallisiert haben, umgesetzt werden können.
Details zur Lösung
Im abschließenden Abschnitt wird die Umsetzung der Lösung im Detail vorgestellt.
Zunächst wird jedes Modul durch eine Beschreibung skizziert, dann wird die
Benutzung des Moduls und die Integration in die Anwendung beschrieben, und
abschließend werden unter dem Punkt Implementierung die interessanten technischen
Details erläutert.
Am Ende des Kapitels wird gezeigt, wie mittels einiger der umgesetzten Module
Schritt für Schritt eine kollaborative Anwendung erstellt werden kann. In jedem
Schritt werden die in dem Schritt verwendeten Module mit den entsprechenden
Elementen in CURE 7 verglichen.
7
CURE ist eine kollaborative Lernplattform, die an der FernUni in Hagen entwickelt wurde (Haake et
al. 2004). Eine nähere Beschreibung zu CURE befindet sich in dieser Arbeit in den Kapiteln 2.2.3.1
und 5.4.
2009-09-10
9/107
Anforderungsanalyse
2 Anforderungsanalyse
In diesem Kapitel wird der Problembereich analysiert, aus den Ergebnissen der
Analyse werden anschließend die Anforderungen an das zu implementierende System
abgeleitet.
2.1 Webbasierte Groupware Anwendungen 8
Einer der großen Vorteile von webbasierten Anwendungen ist, dass Client und Server
über ein Netzwerk miteinander verbunden sind, und dass somit die räumliche
Entfernung zwischen Client und Server unerheblich ist. Des Weiteren muss auf der
Client-Seite keine Software installiert werden, da eine Webanwendung in einem
Webbrowser ausgeführt wird. Dadurch sind webbasierte Anwendungen auch
Plattformunabhängig.
Aufgrund der hohen Anforderungen, die die Benutzer an eine Anwendung der Web
2.0 Generation stellen, sind webbasierte kollaborative Systeme relativ komplex, was
folgende Abbildung veranschaulicht.
Abb. 1: Kategorien von Webanwendungen (Kappel et al 2004, S. 7)
Wie Kappel et al (2004, S. 8) beschreiben, werden webbasierte kollaborative
Anwendungen insbesondere zur Kooperation bei unstrukturierten Vorgängen
eingesetzt, wobei der Bedarf an Kommunikation zwischen den kooperierenden
Benutzern dabei besonders hoch ist.
Die Komplexität der Realisierung webbasierter kollaborative Anwendungen der Web
2.0 Generation wird noch dadurch gesteigert, dass das im Web üblicherweise für die
Übertragung von Daten verwendete http 9 naturgemäß schlecht für synchrone
8
Die Begriffe Groupware Anwendung und kooperatives System werden in dieser Arbeit synonym
verwendet.
9
http steht für Hypertext Transfer Protocol.
2009-09-10
10/107
Anforderungsanalyse
Zusammenarbeit 10 geeignet ist: Die Kommunikation zwischen Client und Server
verläuft bei einer Webanwendung im Normalfall so, dass der Client erst eine
Verbindung zum Server aufbaut, und dann eine Anfrage an den Server schickt. Die
Webanwendung, die auf dem Server läuft, verarbeitet die Anfrage, und der Server
sendet das Ergebnis der Anfrage zurück an den Client. Diese Art der Kommunikation
wird auch als request-response Prinzip oder synchrone Kommunikation bezeichnet
(Kappel et al 2006, S. 71).
Für ein kollaboratives System ist es jedoch notwendig, dass Informationen (wie z.B.
eine Änderung, die ein Client durchführt) möglichst in Echtzeit an alle anderen
Clients verteilt werden, was mit dem request-response Prinzip schwierig umzusetzen
ist.
10
Synchrone / asynchrone Zusammenarbeit (engl. collaboration) wird von Schümmer und Lukosch
(2007, S. 407) wie folgt definiert: "Object usage may be at the same time (synchronous) or at different
points in time (asynchronous)." Synchrone Zusammenarbeit ist also das zeitgleiche Arbeiten von
mehreren Personen an einem Objekt, und asynchrone Zusammenarbeit das zeitlich versetzte Arbeiten
von mehreren Personen an einem Objekt. Mit object wird hier ein shared object bezeichnet - das ist ein
Objekt, welches von mehr als einem Benutzer verwendet wird.
2009-09-10
11/107
Anforderungsanalyse
2.2 Analyse der Entwurfsmuster
Im folgenden Abschnitt werden die Hauptbestandteile einer Groupware vorgestellt,
und die Entwurfsmuster aus (Schümmer und Lukosch, 2007) eingeführt. Im
Anschluss daran werden die wichtigsten Entwurfsmuster für die Implementierung
ermittelt.
2.2.1 Groupware und Group Awareness
Wie schon eingangs erwähnt, sind heute webbasierte kollaborative Systeme in einer
unüberschaubaren Anzahl in unterschiedlichsten Einsatzgebieten in Verwendung. Als
Beispiele seien an dieser Stelle Facebook 11, BSCW 12 und Google Docs 13 erwähnt.
Die Hauptbestandteile einer Groupware Anwendung sind nach (Gerosa 2006)
Kommunikation, Koordination und Kooperation. Diese stehen in einer Beziehung
zueinander, wobei die zentrale Rolle dabei den Group Awareness Elementen
zukommt.
Abb. 2: Hauptbestandteile von Groupware und deren
Beziehungen zueinander (Fuks 2006)
2.2.2 Entwurfsmuster
Groupware-Anwendungen können nach der Art klassifiziert werden, wie sie
Gruppenarbeit unterstützen. Je nach Ausrichtung der Groupware stehen
unterschiedliche Elemente im Vordergrund.
Im Buch Patterns for Computer Mediated Interaction (Schümmer und Lukosch,
2007) wurden die wichtigsten Elemente, aus denen eine Groupware Anwendung
bestehen kann, in Entwurfsmustern beschrieben und nach Layern und Clustern
strukturiert. Die Layer teilen die Entwurfsmuster ein in Community Support, Group
11
http://www.facebook.com/
http://www.bscw.de/
13
http://docs.google.com
12
2009-09-10
12/107
Anforderungsanalyse
Support und Base Technology, und die Cluster gruppieren die einzelnen
Entwurfsmuster nach unterschiedlichen Anwendungsgebieten, wie z.B. Arriving in
the Community, Synchronous Awareness oder Textual Communication.
Diese Entwurfsmuster dienen als Grundlage für diese Arbeit, die wichtigsten Muster
für ein kollaboratives System sollen als Module implementiert werden.
2.2.3 Ermittlung der wichtigsten Entwurfsmuster
Im folgenden Abschnitt wird die Vorgehensweise erläutert, die zur Ermittlung der zu
implementierenden Entwurfsmuster geführt hat.
2.2.3.1 Untersuchung: Entwurfsmuster in Anwendungen
Zunächst wurde eine Voruntersuchung 14 durchgeführt, in der einige Anwendungen
dahingehend untersucht wurden, welche Entwurfsmuster aus Schümmer und Lukosch
(2007) in den Anwendungen vorkommen. Die Auswahl der zu untersuchenden
Anwendungen wurde so getroffen, dass zum Einen der Fokus auf Anwendungen mit
Group Awareness Elementen gerichtet wurde, und dass zum anderen ein möglichst
breites Spektrum von Entwurfsmustern für die Untersuchung abgedeckt wurde.
Untersuchte Anwendungen
•
CURE (Collaborative Universal Remote Education)
CURE ist eine kollaborative Lernplattform, die an der FernUni in Hagen
entwickelt wurde. CURE baut auf dem Raumkonzept auf, das bedeutet, dass die
Lernumgebung aus Räumen besteht, Räume können miteinander verlinkt werden
(Haake et al. 2004, S. 3 ff.). Benutzer kooperieren in CURE, indem sie in einem
Raum die vom Raum zur Verfügung gestellten Kommunikationsmedien nutzen.
Zudem können die Benutzer in den Räumen Seiten erstellen, und bearbeiten.
CURE kann unter folgendem Link aufgerufen werden: http://mapper.fernunihagen.de/CURE/
14
Die Untersuchung wurde zwischen dem 6.12.2008 und dem 31.12.2008 durchgeführt, sie ist
natürlich nicht repräsentativ.
2009-09-10
13/107
Anforderungsanalyse
Abb. 3: CURE Login Screen
(Quelle: http://mapper.fernuni-hagen.de/CURE/)
•
Google Docs
Google Docs ist eine Groupware, mit der mehrere Benutzer gleichzeitig
Dokumente von unterschiedlichem Format bearbeiten können. In Google Docs
kooperieren Benutzer, indem sie Dokumente teilen (share), und diese bearbeiten.
Die Homepage befindet sich auf: http://docs.google.com
Abb. 4: Google Docs, Documents
(Quelle: http://docs.google.com/ )
•
facebook
Facebook ist eine Website zur Bildung und Unterhaltung sozialer Netzwerke
(Facebook 2009). In der Grundversion von Facebook beschränkt sich die
Kooperation im Wesentlichen auf den Austausch von Nachrichten, Bildern und
Videos. Da Facebook aber durch Plug-Ins erweiterbar ist, sind zahlreiche PlugInswie Spiele, Kommunikationsanwendungen und Spaßprogramme verfügbar.
Die Homepage ist unter dem Link http://www.facebook.com/ zu erreichen.
2009-09-10
14/107
Anforderungsanalyse
Abb. 5: Facebook Login Screen
(Quelle: http://www.facebook.com/)
•
eBay
eBay ist eine bekannte Internet Auktionsplattform, auf der Benutzer durch
Vorbereitung und Durchführung von Handelstransaktionen miteinander
kooperieren. Die Plattform lässt sich über den Link http://www.ebay.com/
erreichen.
Abb. 6: ebay Produktsuche (Quelle: http://www.ebay.com/)
•
15
Skype
Skype ist eine VoIP 15-Software mit Chat-Funktionalitäten. Benutzer kooperieren
mit Skype, indem sie miteinander telefonieren, chatten, oder untereinander Daten
austauschen. Skype kann über eine Plug-In Schnittstelle erweitert werden,
zahlreiche Plug-Ins für Kooperation sind verfügbar.
Der Link zur Homepage von Skype lautet: http://skype.com
VoIP ist die Abkürzung für Voice over IP.
2009-09-10
15/107
Anforderungsanalyse
Abb. 7: Skype (Version 3.8.0.188)
•
El Dorado
El Dorado ist eine vollständige Community Web Applikation, die in Ruby on
Rails geschrieben wurde. Für die Kooperation stehen ein Forum, ein Gruppenchat
und ein File Repository zur Verfügung.
Die Homepage befindet sich unter dem Link http://almosteffortless.com/eldorado/
Abb. 8: El Dorado, Demo Seite (Quelle: http://eldoradoapp.com/)
•
Thetis
Thetis ist eine Groupware mit Fokus auf Content-Management-System /
Knowledge Management. Thetis basiert auf Ruby on Rails. Für die Kooperation
stehen Items (ähnlich wie Threaded Discussion), ein Shared File Repository und
das Programm PaintMail (ein Zeichenprogramm) zur Verfügung. Die Homepage
von Thetis ist unter folgendem Link abrufbar: http://rubyforge.org/projects/thetis/
2009-09-10
16/107
Anforderungsanalyse
Abb. 9: Thetis Demo, Desktop (Quelle: http://sysphonic.com/thetis/)
•
eXPlain PMT (Project Management Tool)
Das Programm eXPlain PMT ist eine Groupware zur Koordination von Extreme
Programming Aktivitäten, insbesondere zur Verwaltung von Projekten und deren
Story Cards. Die Benutzer kooperieren über das Dashboard, das als Interaction
Directory dient, miteinander. Die Software basiert auf Ruby on Rails, die
Homepage von eXPlain PMT befindet sich auf:
http://wiki.github.com/explainpmt/explainpmt
Abb. 10: eXPlain PMT, Dashboard (Version: 20070423.0)
•
Boxroom
Boxroom ist ein Projekt, das auf Ruby on Rails basiert, und das als Grundlage für
eine Web-Applikation zur Verwaltung von Dateien entwickelt wurde. In Boxroom
erfolgt die Kooperation durch den Austausch von Dateien. Die Homepage von
Boxroom lässt sich über folgenden Link abrufen:
http://boxroom.rubyforge.org/index.html
2009-09-10
17/107
Anforderungsanalyse
Abb. 11: Boxroom Folder
(Quelle: http://boxroom.rubyforge.org/screenshots.html )
Vorgehensweise bei der Untersuchung
Zunächst wurden sämtliche Entwurfsmuster aus (Schümmer und Lukosch 2007)
aufgelistet. Danach wurde jede einzelne Anwendung dahingehend untersucht, welche
Entwurfsmuster in der jeweiligen Anwendung umgesetzt wurden.
2.2.3.2 Vorauswahl
Um die Anzahl der zu implementierenden Entwurfsmuster zu verringern, wurde eine
Vorauswahl getroffen. Dabei wurden alle Entwurfsmuster, die in den untersuchten
Anwendungen gar nicht, oder nur einmal vorgekommen sind, und einen niedrigen
Reifegrad 16 aufweisen, aus der Auswahl entfernt.
Ergebnis der Untersuchung nach der Vorauswahl
Tabelle 1 zeigt das Ergebnis der Untersuchung nach der Vorauswahl. Die linke Spalte
gibt den Namen des Entwurfsmusters an, dann folgt eine Spalte rechts daneben die
Anzahl, in wie vielen der untersuchten Anwendungen das entsprechende
Entwurfsmuster vorgekommen ist. Im Index der Tabelle befindet sich ggf. ein
Kommentar zum entsprechenden Punkt der Untersuchung.
16
Der Reifegrad (maturity) der Entwurfsmuster (Schümmer und Lukosch 2007, S. 30) wird in Form
von Sternen (asterisks) neben dem Namen des Entwurfsmusters angegeben, wobei ** dem höchsten
Reifegrad entspricht, und keine Sterne den niedrigsten Reifegrad darstellt.
2009-09-10
18/107
Anforderungsanalyse
Tabelle 1: Ergebnis der Untersuchung nach der Vorauswahl
Aus der Untersuchung geht unter anderem hervor, dass jede untersucht Groupware
Anwendung eine Benutzerverwaltung besitzt. Außerdem ist auffällig, dass
Entwurfsmuster für synchrone Group Awareness (wie z.B. Remote Field of Vision 17
oder Remote Selection) kaum umgesetzt wurden.
17
Namen von Entwurfsmustern werden in dieser Arbeit durch eine spezielle Schriftart hervorgehoben.
2009-09-10
19/107
Anforderungsanalyse
2.2.3.3 Auswahl der Entwurfsmuster
Die Anzahl der Verwendung der einzelnen Entwurfsmuster in den untersuchten
Anwendungen kann nicht als einziges Kriterium für die Auswahl der Muster
herangezogen werden 18. Das Ergebnis der Untersuchung dient somit nur als Richtwert
für die Auswahl. Als weiteres Kriterium wird deshalb die Beziehungen der
Entwurfsmuster zueinander 19 ausgewählt.
Abb. 12: Entwurfsmuster und deren Beziehungen zueinander (Vorauswahl)
18
Dies lässt sich unter Anderem dadurch begründen, dass die Auswahl der untersuchten Anwendungen
nicht repräsentativ ist, und die Anzahl der Muster nicht mit deren Wichtigkeit korrelieren muss.
19
Related Patterns (Schümmer und Lukosch, 2007)
2009-09-10
20/107
Anforderungsanalyse
Es werden somit jene Entwurfsmuster ausgewählt, die in den Anwendungen der
Untersuchung mindestens sechs mal vorgekommen sind, und zusätzlich werden jene
Entwurfsmuster ausgewählt, die oft zusammen mit den am häufigsten
vorgekommenen Mustern verwendet werden (Related Patterns). Muster für synchrone
Group Awareness werden aufgrund der Erkenntnisse aus Abschnitt 2.2.1 bei der
Auswahl höher priorisiert, deshalb wurden User List und Spontaneous
Collaboration zusätzlich ausgewählt.
Nicht explizit als Modul implementiert wurde das Muster Masquerade. Darauf wurde
verzichtet, weil die Zugriffsrechte auf Benutzerdaten einerseits in gewissem Rahmen
durch den Anwendungsentwickler konfigurierbar sind, und die Entwurfsmuster so
implementiert werden, dass die Details der anderen Benutzer lediglich für die
Buddies 20 des Benutzers zugänglich gemacht werden.
Aus dem Cluster Textual Communication wird lediglich Embedded Chat umgesetzt,
weil die anderen ausgewählten Muster nicht in Beziehung zu den anderen Mustern
aus Textual Communication stehen.
Zusammenfassung der Auswahl der Entwurfsmuster
Aus den vorangegangenen Schritten ergibt sich somit folgende Auswahl der zu
implementierenden Entwurfsmuster:
Cluster
Arriving in the Community
Protect Users
Modify Shared Artifacts
Create Places for Collaboration
Textual Communication
Synchronous Group Awareness
Session Management
Management of Shared Objects
Name
Quick Registration
Login
Virtual Me
User Gallery
Buddy List
Availability Status
Quick Goodbye
Group
Shared File Repository
Room
Interaction Directory
Bell
Invitation
Embedded Chat
User List
Spontaneous Collaboration
Interactive User Info
Collaborative Session
Centralized Objects
Remote Subscription
Mediated Updates
Immutable Versions
Tabelle 2: Auswahl der zu implementierenden Entwurfsmuster
Nachdem die zu implementierenden Entwurfsmuster ermittelt wurden, werden nun
die weiteren Anforderungen an diese Muster näher untersucht.
20
Buddy: siehe Kapitel 5.2.4
2009-09-10
21/107
Anforderungsanalyse
2.3 Einzelne Module
Modularität ist die Aufteilung eines Ganzen in Teile, diese Teile werden als Module
bezeichnet (Wikipedia 2009b). Bereits in der Aufgabenstellung wurde definiert, dass
die Entwurfsmuster als Module zu realisieren sind.
Booch (1993) definiert den Begriff Modularität wie folgt:
"Modularität ist die Eigenschaft eines Systems, das in einen Satz kohäsiver
und locker gekoppelter Module zerlegt worden ist."
Starke Kohäsion bedeutet, dass ein Modul ein logisch zusammenhängendes
Teilproblem behandelt, und schwache Kopplung heißt, dass die Abhängigkeit eines
Moduls von anderen Modulen möglichst klein sein sollte (Winter 2005, S. 333 ff.).
Die Entwurfsmuster sollen also in einzelnen Modulen realisiert werden, die in Bezug
zu anderen Modulen möglichst lose gekoppelt sind, und eine starke Kohäsion nach
innen aufweisen. Die Module sollen nach dem Baukastenprinzip verwendet werden
können.
Einbindung von Modulen in Rails
Bei der Frage, auf welche Art und Weise die Module selbst in die Zielanwendung
eingebunden werden können, bietet Rails grundsätzlich folgende Möglichkeiten an
(Fischer 2008, S. 343 ff.):
• Libraries
Diese können im einfachsten Fall nur aus einer einzelnen Datei bestehen. Sie
werden üblicherweise in das Verzeichnis /lib kopiert und über das Schlüsselwort
require 'Bibliothek' 21 in eine Anwendung eingebunden.
• Gems
Werden üblicherweise ins Ruby-Verzeichnis installiert und systemweit verfügbar
gemacht, müssen nicht ins /lib-Verzeichnis kopiert werden, sondern können direkt
über require 'name' in die Anwendung eingebunden werden.
• Plug-Ins
Befinden sich im Verzeichnis vendor/plugins direkt unter der Wurzel des
Anwendungsverzeichnisses. Jedes Plug-In besitzt einen eigenen Generator, dieser
kann durch script/plugin install name_des_plugins aufgerufen werden.
Plug-Ins können direkt in das Zielverzeichnis der Anwendung kopiert werden.
Jede Anwendung kann so unterschiedliche Plug-Ins verwenden, und die Plug-Ins
können auch einfach wieder entfernt werden. Außerdem kann der Code von PlugIns über die Datei init.rb, die jedesmal beim Start der Anwendung gelesen wird,
direkt in die Anwendung eingebunden werden.
Plug-Ins erscheinen für die Realisierung der Entwurfsmuster am geeignetsten zu sein,
deshalb werden die Entwurfsmuster als Plug-Ins implementiert.
21
Die Nichtproportionalschrift wird in dieser Arbeit für Codebeispiele und Befehle verwendet.
2009-09-10
22/107
Anforderungsanalyse
2.4 Elemente sollen sich nahtlos in die Rails Architektur
einbinden lassen
Nachdem die Vorgabe lautet, dass sich die kooperativen Elemente nahtlos in die Ruby
on Rails Architektur einbinden lassen sollen, werden als nächstes einige
Eigenschaften und Prinzipien der Rails Architektur diskutiert.
Model, View, Controller
Die Rails-Architektur folgt dem Model, View, Controller (MVC) Entwurfsmuster
(Krasner und Pope 1988, S. 26–49). Dem entsprechend repräsentieren in Rails die
Models die Daten in der Anwendung und implementieren die Domänenlogik, die
Views bilden das User Interface, und die Controller sind für das Handling der
Benutzeranfragen, und für die Vermittlung zwischen den Views und den Models und
für die Geschäftslogik verantwortlich.
Folgende Abbildung veranschaulicht die MVC Architektur:
1. Der Webbrowser sendet eine Anfrage an den Controller.
2. Der Controller interagiert mit dem Model.
3. Der Controller ruft die View auf.
4. Die View wird vom Webbrowser angezeigt.
Abb. 13: Model, View, Controller
Daraus lassen sich folgende Anforderungen ableiten:
• Die Datenhaltung und die Domänenlogik wird in den Models implementiert.
• Alle Benutzeranfragen werden von den Controllern entgegengenommen, und an
die Views, bzw. an die Models weitergeleitet.
• Die Controller implementieren die Geschäftslogik.
• Die Views werden vom Controller aufgerufen, Views beinhalten, wenn möglich,
keine Logik.
Convention over Configuration
Eines der Grundprinzipen von Rails lautet Convention over Configuration. Nach
diesem Prinzip wird davon ausgegangen, dass wenig Konfiguration notwendig ist,
wenn bestimmte Konventionen eingehalten werden.
Einige dieser Konventionen lauten (WikiBooks 2009a):
2009-09-10
23/107
Anforderungsanalyse
•
•
•
•
•
•
Sourcecode- Dateien sind immer in Kleinbuchstaben mit Underscores als
Trennzeichen benannt.
Klassennamen sind immer in der CamelCase Schreibweise geschrieben.
Models sind im Singular, Tabellen im Plural benannt.
Controller sind im Plural benannt.
Primärschlüssel haben die Bezeichnung id.
Fremdschlüssel haben die Bezeichnung name_id.
Abb. 14: Klassen und Tabellen
(Quelle: http://openbook.galileocomputing.de/ruby_on_rails/)
Daraus lassen sich folgende Anforderungen ableiten:
• Die Rails-Konventionen sollen eingehalten werden.
• Wenn möglich, soll externe Konfiguration, wie z.B. über Konfigurationsdateien,
vermieden werden.
Don´t Repeat Yourself (DRY)
Hunt (2000) definiert DRY folgendermaßen:
"Every piece of knowledge must have a single, unambiguous, authoritative
representation within a system."
Dieses Grundprinzip von Rails besagt also, dass Wiederholungen (Redundanzen) in
der Programmierung vermieden werden sollen.
Daraus lässt sich folgende Anforderungen ableiten:
• Code soll nicht dupliziert werden.
2.5 Verwendbarkeit
Wie in der Aufgabenstellung definiert, sollen sich die Module einfach und flexibel
verwenden lassen.
Da die Hauptbenutzer der Module Anwendungsentwickler sind, beginnt die
Betrachtung der Verwendbarkeit bei der Generierung und Installation der
Komponenten in die Anwendung durch den Anwendungsentwickler. Die Module
sollen einfach und ohne größeren Aufwand in die Anwendung installierbar sein.
2009-09-10
24/107
Anforderungsanalyse
Nach der Installation erfolgt die Integration in die Anwendung. Bei diesem Schritt
integriert der Anwendungsentwickler die installierten Komponenten des Moduls in
seine Anwendung.
Ein weiteres Merkmal
Plattformunabhängigkeit.
in
Bezug
auf
die
Verwendbarkeit
ist
die
2.6 Konfigurierbarkeit
Konfigurierbarkeit ist bei Modulen unerlässlich, weil die Module in bestehende
Anwendungen integriert werden, und auch flexibel einsetzbar sein sollen. Folgende
Möglichkeiten für die Konfigurierung wurden ermittelt:
1. Generierung und Installation in die Anwendung
Da die Module als Plug-Ins realisiert werden, bietet sich die erste Möglichkeit der
Konfiguration bereits bei der Generierung und der Installation des Plug-Ins in die
Anwendung, über den Aufruf des Generators.
2. Tabelle
Nach der Generierung werden, sofern erforderlich, die Tabellen für die Datenbank
erstellt. Hier bietet sich auch die nächste Konfigurationsmöglichkeit, indem die
Struktur der Tabelle vom Anwendungsentwickler nach Bedarf durch Hinzufügen
bzw. Entfernen von Attributen angepasst wird.
3. Model-Ebene
Eine weitere in Rails übliche Möglichkeit der Konfigurierung erfolgt direkt auf
Model-Ebene:
o Objekte können durch eine der von ActiveRecord 22 standardmäßig zur
Verfügung gestellten Arten von Beziehungen miteinander verknüpft werden
(Hansson et al. 2009, S. 360ff).
o Models können durch ein Plug-In erweitert werden (hier ist das acts_as_...
Paradigma sehr beliebt 23).
o Im Model selbst können Parameter im Code geändert werden, die dessen
Eigenschaften beeinflussen.
4. Integration
Auch bei der Einbindung (Integration) der Module in die Anwendung bieten sich
Konfigurationsmöglichkeiten an: Zum einen verwenden Module oft lokale
22
Active Record ist ein Entwurfsmuster, das von Martin Fowler definiert wurde. Er beschreibt es so:
"An object that wraps a row in a database table or view, encapsulates the database access, and adds
domain logic on that data." (Fowler 2003, S. 160)
Der ActiveRecord Mechanismus von Rails arbeitet nach diesem Prinzip, er generiert eine
objektrelationale Abbildung (object relational mapping, ORM) zwischen den Ruby-Objekten der
Anwendung und den Zeilen und Spalten der Datenbank. (Orsini 2007)
Alle Models sind in Rails von der Klasse ActiveRecord abgeleitet.
23
In (WikiBooks 2009b) ist das acts_as Paradigma wie folgt beschrieben: "Acts as methods define
additional behavior for an ActiveRecord object. Often extension of ActiveRecord objects by plugins is
implemented using a custom acts_as_ method."
2009-09-10
25/107
Anforderungsanalyse
Variablen (wie z.B. @users), deren Inhalt durch den Anwendungsentwickler beim
Aufruf des Moduls bestimmt wird, und zum anderen besteht die Möglichkeit,
Module beim Aufruf durch Parameter zu konfigurieren.
5. Externe Konfigurationsdatei
Eine weitere Möglichkeit zur Konfigurierung besteht darin, Konfigurationsdaten
über eine externe Datei bereitzustellen. Dies kann entweder über eine durch das
Plug-In selbst bereitgestellte Konfigurationsdatei erfolgen, oder aber über eine der
von Rails zur Verfügung gestellten Konfigurationsdateien 24.
Von den ermittelten Kunfigurierungsmöglichkeiten sind die Punkte 1, 3 und 4 zu
bevorzugen, weil die Konfigurierung von außen erfolgt, und somit kein, bzw. nur ein
minimaler manueller Eingriff in den Code des Plugins erforderlich ist. Änderungen an
der Tabelle (Punkt 2) sollten im Normalfall nicht notwendig sein, weil dies zu
zusätzlich erforderlichen Änderungen im Code führen kann. In Einzelfällen können
manuelle Eingriffe in den Code gerechtfertigt sein.
Die Konfigurierung über eine externe Datei sollte nach Möglichkeit vermieden
werden, weil dies dem Grundprinzip Convention over Configuration widerspricht.
Grundsätzlich widerspricht die Vorgabe, dass die Module konfigurierbar sein sollen,
nicht dem Prinzip Convention over Configuration, da die in Abschnitt 2.4 angeführten
Konventionen trotz der Konfigurierbarkeit der Module einzuhalten sind.
2.7 Codebasis
Für die Extrahierung von Code aus bestehenden Anwendungen, müssen grundsätzlich
folgende Bedingungen erfüllt sein:
• Verfügbarkeit des Sourcecodes, dies schließt auch das Lizenzmodell mit ein
• Aktualität des Sourcecodes (Kriterium: aktuelle Rails Version)
2.8 Zusammenfassung der Anforderungen
Neben den zu implementierenden Entwurfsmustern, die bereits am Ende des Kapitels
2.2.3 angeführt wurden, ergeben sich somit folgende Anforderungen an die Module:
•
•
•
•
•
•
•
•
24
Einzelne, lose gekoppelte Module mit starker Kohäsion
Die Module sind als Plug-Ins implementiert
Die Implementierung entspricht den Vorgaben der Rails Architektur
Die Plug-Ins sind einfach zu installieren
Die Plug-Ins sind einfach in die Anwendung integrierbar
Plattformunabhängigkeit
Die Plug-Ins sind konfigurierbar
Sourcecode verfügbar und aktuell (nur für Anwendungen)
siehe dazu z.B. (Hansson 2009, S. 264 ff.)
2009-09-10
26/107
State of the Art
3 State of the Art
Nachdem die Anforderungen definiert worden sind, wird nun untersucht, wie diese
umgesetzt werden können.
In diesem Kapitel werden einige Plug-Ins und Open Source Anwendungen in Bezug
auf ihre Eignung zur Erfüllung der Anforderungen aus Abschnitt 2 näher untersucht.
Abschließend folgt ein Fazit, inwiefern sich die untersuchten Anwendungen und PlugIns dafür eignen, um eine Bibliothek von Modulen für kooperative Anwendungen zu
erstellen.
3.1 Untersuchung von existierenden Plug-Ins
Die Untersuchungen sind jeweils so aufgebaut, dass zu Beginn das jeweilige Plug-In
kurz vorgestellt wird, dann folgt eine Bewertung des Plug-Ins anhand der ermittelten
Anforderungen, ein Fazit rundet die Betrachtung ab.
Zunächst werden Plug-Ins untersucht, die sich als Grundlage für die synchrone
Zusammenarbeit eignen könnten.
3.1.1 Plug-Ins für Synchrone Zusammenarbeit 25
CanHasChat
Dies ist ein Chat Plug-In, das die Nachrichten mittels XMPP 26 verschickt. Die
Homepage von CanHasChat befindet unter folgendem Link:
http://agilewebdevelopment.com/plugins/can_has_chat
•
Ziel
Das Plug-In wurde dahingehend untersucht, ob es sich als Grundlage für die
Realisierung des Entwurfsmusters Embedded Chat eignet.
•
Bewertung und Fazit
Da das Plug-In nicht auf MS Windows installierbar ist, kommt es nicht für die
Verwendung in Frage.
Anforderung
Bewertung
9
Embedded Chat
Einzelne, lose gekoppelte Module mit starker Kohäsion
9
Als Plug-In implementiert
Entspricht den Vorgaben der Rails Architektur
9
Einfach zu installieren
9
Einfach in die Anwendung integrierbar
8
Plattformunabhängig
Konfigurierbar
Tabelle 3: CanHasChat (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt)
25
26
Diese Untersuchungen wurden zwischen dem 19.12.2008 und dem 18.1.2009 durchgeführt
Extensible Messaging and Presence Protocol (http://www.jabber.org/)
2009-09-10
27/107
State of the Art
ActiveMessaging
ActiveMessaging ist ein Messaging Framework für Ruby On Rails, das für den
Transport der Nachrichten unterschiedliche Messaging Systeme (unter anderem
Stomp 27, JMS 28 und WebSphere MQ 29) unterstützt, die Homepage befindet sich auf:
http://code.google.com/p/activemessaging/wiki/ActiveMessaging
•
Ziel
Das Plug-In wurde dahingehend untersucht, ob es sich als Grundlage für die
Realisierung des Entwurfsmusters Embedded Chat eignet. Zudem wurde
untersucht, ob es sich als Grundlage für die Module des Clusters Synchronous
Group Awareness eignet.
•
Bewertung und Fazit
Das Modul eignet sich grundsätzlich sowohl für die Realisierung eines
Embedded Chat Moduls, als auch für die Verteilung der synchronen Nachrichten
an die Clients. Als kleiner Nachteil erscheint, dass die Clients die Nachrichten
pollen müssen 30. Ein Vorteil ist, dass auf einfache Art und Weise unterschiedliche
Kommunikationsprotokolle verwendet werden können.
Anforderung
Bewertung
9
Embedded Chat, synchrone Entwurfsmuster
9
Einzelne, lose gekoppelte Module mit starker Kohäsion
9
Als Plug-In implementiert
9
Entspricht den Vorgaben der Rails Architektur
9
Einfach zu installieren
9
Einfach in die Anwendung integrierbar
9
Plattformunabhängig
9
Konfigurierbar
Tabelle 4: ActiveMessaging (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt)
Juggernaut
Juggernaut ist ein Plug-In auf Basis von Flash 31, das es ermöglicht, dass der Server
quasi in Echtzeit aktiv Daten an die Clients verteilt (push), und so synchrone
Webanwendungen ermöglicht.
Die Projektseite ist unter http://juggernaut.rubyforge.org/ zu finden, eine google group
befindet sich unter http://groups.google.com/group/Juggernaut-for-Rails.
•
Ziel
Das Plug-In wurde dahingehend untersucht, ob es sich als Basis für die Module
des Clusters Synchronous Group Awareness eignet.
27
Stomp (Streaming Text Orientated Messaging Protocol): http://xircles.codehaus.org/projects/stomp
JMS (Java Message Service): http://java.sun.com/products/jms/
29
WebSphere MQ (IBM): http://www-01.ibm.com/software/integration/wmq/
30
Quelle: http://groups.google.com/group/activemessagingdiscuss/browse_thread/thread/63f17d759b57eba2/b1325bcd490929b6?lnk=gst&q=poller#b1325bcd49
0929b6 )
31
Adobe Flash: http://www.adobe.com/support/documentation/de/flash/
28
2009-09-10
28/107
State of the Art
•
Bewertung und Fazit
Juggernaut scheint als Kommunikations-Infrastruktur für ein synchrones
kollaboratives System sehr gut geeignet zu sein. Ein Nachteil ist, dass die
Installation unter MS Windows nicht reibungslos funktioniert 32.
Anforderung
Bewertung
9
Embedded Chat, synchrone Entwurfsmuster
9
Einzelne, lose gekoppelte Module mit starker Kohäsion
9
Als Plug-In implementiert
9
Entspricht den Vorgaben der Rails Architektur
Einfach zu installieren
9
Einfach in die Anwendung integrierbar
9
Plattformunabhängig
9
Konfigurierbar
Tabelle 5: Juggernaut (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt)
3.1.2 Andere Plug-Ins
Restful Authentication
Restful Authentication ist ein Plug-In für die Benutzerverwaltung mit Login und
Authentisierung. Die Homepage ist unter folgendem Link abrufbar:
http://agilewebdevelopment.com/plugins/restful_authentication
•
Ziel
Das Plug-In wurde in Bezug auf seine Eignung für die Realisierung der
Benutzerverwaltung, und für die Umsetzung der Entwurfsmuster Quick
Registration, Login und Quick Goodbye, untersucht.
•
Bewertung und Fazit
Restful Authentication ist in der Rails-Welt sehr verbreitet, und hat sich für die
Benutzerverwaltung und Authentisierung bewährt. Das Plug-In erfüllt alle
Anforderungen, lediglich die Integration in eine bestehende Anwendung wurde
nicht bewertet, da das Plug-In für die Realisierung der Benutzerverwaltung
ausgewählt wurde, und somit die Integration in eine bestehende Anwendung
nebensächlich ist.
Anforderung
Bewertung
9
Quick Registration, Login, Quick Goodbye
9
Einzelne, lose gekoppelte Module mit starker Kohäsion
9
Als Plug-In implementiert
9
Entspricht den Vorgaben der Rails Architektur
9
Einfach zu installieren
Einfach in die Anwendung integrierbar
9
Plattformunabhängig
9
Konfigurierbar
Tabelle 6: Restful Authentication (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt)
32
Siehe Anhang, Installation von Juggernaut.
2009-09-10
29/107
State of the Art
Simple Groups
Simple Groups ist ein Plug-In, das Rails um die Funktionalität für die Verwaltung von
Gruppen erweitert, die Homepage befindet sich auf
http://agilewebdevelopment.com/plugins/simple_groups.
•
Ziel
Es wurde untersucht, ob sich das Plug-In für die Umsetzung des Entwurfsmusters
Group eignet.
•
Bewertung und Fazit
Das Plug-In scheint sehr gut für die Umsetzung des Entwurfsmusters Group
geeignet zu sein.
Anforderung
Bewertung
9
Group
9
Einzelne, lose gekoppelte Module mit starker Kohäsion
9
Als Plug-In implementiert
9
Entspricht den Vorgaben der Rails Architektur
9
Einfach zu installieren
9
Einfach in die Anwendung integrierbar
9
Plattformunabhängig
9
Konfigurierbar
Tabelle 7: Simple Groups (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt)
Attachment Fu
Dieses Plug-In wurde als Unterstützung für das Handling von Dateien entwickelt. Die
Homepage ist unter http://agilewebdevelopment.com/plugins/attachment_fu zu
finden.
•
Ziel
Das Plug-In wird in Bezug auf seine Eignung für die Umsetzung des
Entwurfsmusters Shared File Repository untersucht.
•
Bewertung und Fazit
Obwohl das Plug-In auf den Umgang mit Bilddateien spezialisiert ist, eignet es
sich auch als Grundlage für die Entwicklung eines Shared File Repository.
Außerdem kann es für die Verwaltung des User Avatars 33 verwendet werden.
Lediglich die Installation der vom Plug-In benötigten Komponenten für die
Bildverarbeitung ist relativ aufwändig.
Soll eine Versionierung der Artefakte inklusive Zeitstempel erfolgen, so kann ein
zusätzliches Plug-In (wie z.B. acts_as_versioned) verwendet werden.
33
"Die grafische Repräsentation eines Benutzers in der virtuellen Umgebung wird als Avatar
bezeichnet." (Rechenberg und Pomberger 2002, S. 851)
2009-09-10
30/107
State of the Art
Anforderung
Bewertung
9
Shared File Repository
9
Einzelne, lose gekoppelte Module mit starker Kohäsion
9
Als Plug-In implementiert
9
Entspricht den Vorgaben der Rails Architektur
Einfach zu installieren
9
Einfach in die Anwendung integrierbar
9
Plattformunabhängig
9
Konfigurierbar
Tabelle 8: Attachment Fu (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt)
acts_as_versioned
Dieses Plug-In ermöglicht es, ein Model um Versionierungs-Funktionalitäten zu
erweitern, die Homepage befindet sich auf
http://agilewebdevelopment.com/plugins/acts_as_versioned.
•
Ziel
Das Plug-In wurde mit dem Ziel untersucht, eine Versionierung von Artefakten
mit Zeitstempel zu realisieren (Immutable Versions).
•
Bewertung und Fazit
Die Untersuchung hat gezeigt, dass Versionierung mit diesem Plug-In sehr gut
umgesetzt werden kann. Deshalb wird es auch zur Implementierung von
Immutable Versions, und allen anderen Entwurfsmustern, die Versionierung
benötigen, ausgewählt.
Anforderung
Bewertung
9
Immutable Versions
9
Einzelne, lose gekoppelte Module mit starker Kohäsion
9
Als Plug-In implementiert
9
Entspricht den Vorgaben der Rails Architektur
9
Einfach zu installieren
9
Einfach in die Anwendung integrierbar
9
Plattformunabhängig
9
Konfigurierbar
Tabelle 9: acts_as_versioned (9: erfüllt, -: mäßig erfüllt, 8: nicht erfüllt)
3.1.3 Zusammenfassung
Aufgrund der Untersuchungen der Plugins aus den Abschnitten 3.1.1 und 3.1.2
werden folgende Plugins für die Implementierung der jeweiligen Entwurfsmuster
ausgewählt:
• Juggernaut: als Infrastruktur für Plugins, die synchrone Zusammenarbeit erfordern
• Restful Authentication: Quick Registration, Login, Quick Goodbye
• Simple Groups: Group
• Attachment Fu: Shared File Repository
• acts_as_versioned: Immutable Versions
2009-09-10
31/107
State of the Art
3.2 Untersuchung von Open Source Anwendungen
Die bereits in Abschnitt 2.2.3.1 vorgestellten Rails- basierten Anwendungen El
Dorado, Thetis, eXPlain PMT und Boxroom werden nun dahingehend untersucht, ob
sie sich als Basis für die Umsetzung der Entwurfsmuster eignen, bzw. ob Teile der
Anwendungen extrahiert und für die Umsetzung einzelner Entwurfsmuster verwendet
werden können. Ein besonderer Schwerpunkt wird bei der Untersuchung auf die
Umsetzung der Muster des Clusters Synchronous Group Awareness gelegt.
Zusätzlich zu den in der Anforderungsanalyse definierten Kriterien, wird die Anzahl
der in den Anwendungen umgesetzten Muster aus den jeweiligen Clustern für die
Bewertung herangezogen. Diese Anzahl ist aus der Tabelle 1 aus Abschnitt 2.2.3.1
entnommen.
Somit ergeben sich folgende Kriterien für die Bewertung der Anwendungen:
• Die Anzahl der in den Anwendungen umgesetzten Muster aus den jeweiligen
Clustern, im Vergleich zu den ausgewählten Mustern
• Verfügbarkeit des Sourcecodes
• Aktualität des Sourcecodes (Rails-Version)
Zu jeder untersuchten Anwendung folgt nun eine kurze Zusammenfassung der
Analyse, und ein Fazit in Bezug auf die Eignung für die Extrahierung von Codeteilen
für die Erstellung von Modulen.
El Dorado
El Dorado ist eine vollständige Community Web Applikation.
•
Analyse
Die Applikation selbst bietet aus Benutzersicht viele Möglichkeiten, Elemente des
Clusters Synchronous Group Awareness sind jedoch nur eingeschränkt vorhanden.
Als Plug-In für das Shared File Repository wurde Attachment Fu verwendet.
Anforderung
Anzahl Muster aus Cluster Arriving in the Community
Anzahl Muster aus Cluster Protect Users
Anzahl Muster aus Cluster Modify Shared Artifacts
Anzahl Muster aus Cluster Textual Communication
Anzahl Muster aus Cluster Create Places for Collaboration
Anzahl Muster aus Cluster Synchronous Group Awareness
Anzahl Muster aus Cluster Session Management
Anzahl Muster aus Cluster Management of Shared Objects
Anzahl Muster aus Cluster Data Consistency Support
Code verfügbar?
Rails-Version
Tabelle 10: El Dorado
•
Ergebnis
4/5
0/2
1/2
1/1
2/4
2/3
0/1
2/3
0/1
ja
2.2.2
Fazit
Die Anwendung ist zwar recht umfangreicht und macht einen soliden Eindruck,
aber besonders die interaktiven Elemente sind vom Funktionsumfang her recht
2009-09-10
32/107
State of the Art
eingeschränkt, deshalb erscheint die Extrahierung einzelner Entwurfsmuster nicht
besonders erfolgsversprechend zu sein. Da als Grundlage für das Shared File
Repository Attachment Fu verwendet wurde, würde die Extrahierung dieses Teils
keine erkennbaren Vorteile im Vergleich zur direkten Verwendung von
Attachment Fu bringen.
Thetis
Thetis ist eine Groupware mit Fokus auf Content-Management-System / Knowledge
Management.
•
Analyse
Das Programm wirkt zwar unübersichtlich, bietet aber viele Möglichkeiten,
besonders was den Cluster Modify Shared Artifacts betrifft.
Anforderung
Anzahl Muster aus Cluster Arriving in the Community
Anzahl Muster aus Cluster Protect Users
Anzahl Muster aus Cluster Modify Shared Artifacts
Anzahl Muster aus Cluster Textual Communication
Anzahl Muster aus Cluster Create Places for Collaboration
Anzahl Muster aus Cluster Synchronous Group Awareness
Anzahl Muster aus Cluster Session Management
Anzahl Muster aus Cluster Management of Shared Objects
Anzahl Muster aus Cluster Data Consistency Support
Code verfügbar?
Rails-Version
Tabelle 11: Thetis
•
Ergebnis
3/5
0/2
2/2
0/1
2/4
0/3
0/1
2/3
0/1
ja
2.1.2
Fazit
Trotz der vielen Möglichkeiten, die Thetis bietet, wird davon ausgegangen, dass
eine Neuentwicklung unter Verwendung der Plug-Ins Restful Authentication,
Simple Groups und Attachment Fu ein vergleichbares Ergebnis bringt, jedoch
effizienter ist, als die Extrahierung der entsprechenden Codeteile aus Thetis.
eXPlain PMT
eXPlain PMT ist eine Groupware zur Koordination von Extreme Programming
Aktivitäten, insbesondere zur Verwaltung von Projekten und deren Story Cards.
•
Analyse
Die Elemente für Synchronous Group Awareness sind nur eingeschränkt
brauchbar, denn die Kommunikation erfolgt entweder über Email oder über das
Dashboard (eines pro Projekt) über das Anlegen eines Milestones.
2009-09-10
33/107
State of the Art
Anforderung
Anzahl Muster aus Cluster Arriving in the Community
Anzahl Muster aus Cluster Protect Users
Anzahl Muster aus Cluster Modify Shared Artifacts
Anzahl Muster aus Cluster Textual Communication
Anzahl Muster aus Cluster Create Places for Collaboration
Anzahl Muster aus Cluster Synchronous Group Awareness
Anzahl Muster aus Cluster Session Management
Anzahl Muster aus Cluster Management of Shared Objects
Anzahl Muster aus Cluster Data Consistency Support
Code verfügbar?
Rails-Version
Tabelle 12: eXPlain PMT
•
Ergebnis
3/5
1/2
0/2
0/1
2/4
2/3
0/1
2/3
0/1
ja
2.0.2
Fazit
Aufgrund der eingeschränkten Brauchbarkeit der Synchronous Group Awareness
Elemente (siehe Ergebnisse der Untersuchung aus Abschnitt 2.2.3.1) erscheint
eine Adaptierung von eXPlain PMT nicht sinnvoll zu sein.
Boxroom
Boxroom ist ein Projekt, das als Grundlage für eine Web-Applikation zur Verwaltung
von Dateien verwendet werden kann.
•
Analyse
Das File Repository sieht vielversprechend aus, es liegt jedoch in der RailsVersion 1.2.2 vor. Die Volltextsuche hat nicht funktioniert, was aber auch auf ein
Installationsproblem zurückzuführen sein könnte.
Anforderung
Anzahl Muster aus Cluster Arriving in the Community
Anzahl Muster aus Cluster Protect Users
Anzahl Muster aus Cluster Modify Shared Artifacts
Anzahl Muster aus Cluster Textual Communication
Anzahl Muster aus Cluster Create Places for Collaboration
Anzahl Muster aus Cluster Synchronous Group Awareness
Anzahl Muster aus Cluster Session Management
Anzahl Muster aus Cluster Management of Shared Objects
Anzahl Muster aus Cluster Data Consistency Support
Code verfügbar?
Rails-Version
Tabelle 13: Boxroom
•
Ergebnis
3/5
0/2
2/2
0/1
0/4
0/3
0/1
2/3
0/1
ja
1.2.2
Fazit
Aufgrund der nicht aktuellen Version von Rails, und der ungelösten Probleme mit
der Volltextsuche kommt die Verwendung des Projekts zur Implementierung von
Entwurfsmustern nicht in Frage
2009-09-10
34/107
State of the Art
3.3 Eignung und Defizite bestehender Lösungen für Module
Plug-Ins
Im Web ist eine große, ständig wachsende Menge von Plug-Ins verfügbar. Darunter
sind auch welche zu finden, die das eine oder andere Entwurfsmuster für kooperative
Anwendungen abdecken, und die gestellten Anforderungen erfüllen.
Es gibt jedoch keine umfassende Sammlung von Plug-Ins, die es ermöglicht, daraus
ein kollaboratives System zu erstellen. Besonders Plug-Ins für synchrone Group
Awareness Elemente sind kaum verfügbar.
Anwendungen
Unter den untersuchten Anwendungen erfüllt keine die Anforderungen so treffend,
dass diese ohne größere Anpassungen als Basis für diese Arbeit geeignet ist. Das
Extrahieren von Codeteilen einer Anwendung, um daraus neue Module zu erstellen,
erscheint aus folgenden Gründen nicht sehr zielführend zu sein: Die wichtigen
Entwurfsmuster aus dem Cluster Synchronous Group Awareness wurden in allen
untersuchten Anwendungen kaum hinreichend umgesetzt, weiters können viele der
Funktionalitäten, die in den Anwendungen gut umgesetzt wurden, durch andere,
eigenständige Plug-Ins, ebenfalls abgedeckt werden, was wesentlich effizienter ist.
3.4 Fazit
Ziel dieser Arbeit ist es, eine umfassende Bibliothek von Kooperationsmodulen zur
Verfügung zu stellen, mit denen ein kollaboratives System erstellt werden kann,
wobei der Schwerpunkt bei der Realisierung der Module auf Group Awareness gelegt
werden soll.
Alle untersuchten Anwendungen kommen aus den oben genannten Gründen nicht
dafür in Frage.
Eine vollständige Bibliothek komplett aus frei verfügbaren Modulen zusammen zu
stellen erscheint nicht praktikabel zu sein, denn selbst wenn für jedes Entwurfsmuster
ein verwendbares Plug-In gefunden würde (was als recht unwahrscheinlich erscheint),
wäre das Entwickeln eines kompletten kollaborativen Systems durch das Verwenden
von vielen Plug-Ins aus unterschiedlichen Quellen für den Anwender schwierig und
ineffizient. Einerseits stellen die meisten Plug-Ins unterschiedliche Anforderungen an
vorinstallierte Plug-Ins und die Umgebung, und andererseits müssen die meisten PlugIns unterschiedlich gehandhabt und unterschiedlich in die Zielanwendung integriert
werden. Auch das Kapseln der Plug-Ins aus unterschiedlichen Quellen würde aus
oben genannten Gründen keine zufriedenstellende Usability bringen.
Als beste Möglichkeit erscheint es daher, die Module selbst zu entwickeln, und je
nach Eignung bzw. Verfügbarkeit bestehende Plug-Ins entweder als Basis zu
verwenden, sie zu integrieren, oder sie so anzupassen, dass sie den Anforderungen
entsprechen.
2009-09-10
35/107
Beschreibung der Lösungsidee
4 Beschreibung der Lösungsidee
Nachdem die Anforderungen definiert wurden, und der State of the Art ermittelt
wurde, wird in diesem Kapitel die Lösungsidee beschrieben.
4.1 Gesamtkonzept und Aufbau der Anwendung, Plug-Ins
Durch die Vorgabe, dass einerseits aus den Modulen eine vollständige Groupware
Anwendung erstellt werden soll, und andererseits die Module flexibel eingesetzt
werden können sollen, lassen sich zwei Anwendungsfälle ableiten:
1. Die Module sollen in eine bereits bestehende Anwendung integriert werden.
Dies ist zum Beispiel der Fall, wenn ein Anwendungsentwickler eine bereits
bestehende Anwendung um kooperative Elemente erweitern möchte, es ist aber
auch denkbar, dass einzelne Elemente einer bestehenden Anwendung durch neue
ersetzt werden sollen.
2. Ein kollaboratives System soll von Grund auf neu erstellen werden.
Die Benutzer stehen bei der Zusammenarbeit im Mittelpunkt, deshalb ist die
Benutzerverwaltung ein zentraler Bestandteil einer kollaborativen Anwendung. Es ist
davon auszugehen, dass in Anwendungsfall 1 von einem System ausgegangen wird,
das bereits über eine Benutzerverwaltung verfügt. In Anwendungsfall 2 hingegen soll
ein System inklusive Benutzerverwaltung erstellt werden.
Umsetzung
Um diese beiden Anwendungsfälle zu berücksichtigen, wurde das gesamte Projekt aus
zwei Grundbestandteilen aufgebaut:
•
Basisanwendung, Cooperation
Die Basisanwendung beinhaltet als zentralen Bestandteil die Benutzerverwaltung
und implementiert bereits die Entwurfsmuster Quick Registration, Login und
Quick Goodbye. Alle anderen Module können auf diese Anwendung aufbauen.
Cooperation lässt sich als Gesamtpaket installieren.
•
Ein Paket, das alle implementierten Module beinhaltet, mit CMI 34 bezeichnet
Alle umgesetzten Entwurfsmuster (außer jene, die bereits in der Basisanwendung
enthalten sind) wurden als Plug-Ins 35 implementiert. Sie befinden sich in einem
gemeinsamen Verzeichnis mit dem Namen cmi. Dieses Verzeichnis kann direkt in
das plugins Verzeichnis der Zielanwendung kopiert werden, sämtliche Module
34
Diese Abkürzung steht für Computer Mediated Interaction.
Im folgenden Text werden die Begriffe Modul und Plugin synonym verwendet, wenn aus dem
Kontext klar hervorgeht, was damit gemeint ist.
35
2009-09-10
36/107
Beschreibung der Lösungsidee
werden dann von dort aus wie in Rails üblich über den Generator des Plug-Ins in
die Anwendung installiert.
Dieses Konzept ermöglicht es, dass Anwendungsfall 1 erfüllt werden kann, indem auf
das Basisprojekt verzichtet wird, und lediglich die benötigten Module in die
Anwendung installiert werden.
In Anwendungsfall 2 kann das Basisprojekt als Grundlage für die gesamte
Anwendung verwendet werden, die benötigten Module werden dann in das
Basisprojekt installiert.
4.2 Umsetzung der Entwurfsmuster in Plug-Ins
Um für die Plug-Ins eine schwache Kopplung und starke Kohäsion zu erreichen,
wurden die in Abschnitt 2.2 ausgewählten Entwurfsmuster so umgesetzt, dass
Entwurfsmuster mit starken Abhängigkeiten (wie das z.B. für Room, Invitation und
Bell zutrifft) in Plug-Ins zusammengefasst wurden.
Tabelle 14 gibt einen Überblick, wie die Entwurfsmuster in Plug-Ins (bzw. dem
Basisprojekt) umgesetzt wurden. Die Spalte Plug-In gibt an, in welchem Plug-In
dieses Entwurfsmuster umgesetzt wurde, die durch * gekennzeichneten Muster
wurden durch ein externes Plug-In realisiert.
Name
Quick Registration
Login
Virtual Me
User Gallery
Buddy List
Availability Status
Quick Goodbye
Group
Shared File Repository
Room
Interaction Directory
Bell
Invitation
Embedded Chat
User List
Spontaneous Collaboration
Interactive User Info
Collaborative Session
Centralized Objects
Remote Subscription
Mediated Updates
Immutable Versions
Activity Log
Plug-In
Basisprojekt
cmi_virtual_me
cmi_user_gallery
cmi_buddy_list
cmi_virtual_me
Basisprojekt
Simple Groups*
Attachment Fu*
cmi_room
cmi_embedded_chat
cmi_room, cmi_coll_session
cmi_buddy_list, cmi_room, cmi_coll_session
cmi_interactive_user_info
cmi_coll_session
cmi_room
cmi_remote_subscription
Juggernaut*
acts_as_versioned*
Tabelle 14: Implementierte Entwurfsmuster
2009-09-10
37/107
Beschreibung der Lösungsidee
Wurden Komponenten identifiziert, die von mehreren Plug-Ins benötigt werden, so
wurden diese in separaten Plug-Ins ausgelagert, diese implementieren somit nicht
direkt ein Entwurfsmuster.
Folgende Abbildung zeigt die Plug-Ins und deren Beziehungen zueinander. Einige
Beziehungen zwischen Plug-Ins sind optional, und wurden durch das Stereotyp
<<optional>> gekennzeichnet. Optionale Plug-Ins werden vom jeweiligen Plug-In
selbst nicht benötigt, das Plug-In funktioniert also vollständig ohne die optionalen
Abhängigkeiten. Möchte der Benutzer jedoch die Funktionalität des optionalen PlugIns nutzen, so muss dieses zusätzlich eingebunden werden.
Ausgelagerte Plug-Ins sind in der Abbildung grau hinterlegt.
Aus Gründen der Übersichtlichkeit sind die Abhängigkeiten zu Plug-Ins aus externen
Quellen, die nicht direkt Entwurfsmuster implementieren, hier nicht abgebildet.
Abb. 15: Plug-Ins
4.3 Verwendbarkeit
Generierung , Installation in die Anwendung
Das Verzeichnis, das die Module beinhaltet lässt sich per copy/paste in das plugins
Verzeichnis der Zielanwendung überführen. Danach können die einzelnen Plug-Ins,
wie in Rails üblich, über ruby script\generate generator [options] [args]
generiert, und in die Anwendung installiert werden.
Jedes Plug-In verfügt, sofern erforderlich, über einen eigenen Generator.
2009-09-10
38/107
Beschreibung der Lösungsidee
Integration in die Anwendung
Wie die Integration der Plug-Ins im Einzelnen erfolgt, ist in Abschnitt 5 beschrieben.
Grundsätzlich wurde jedoch darauf Wert gelegt, dass für den Anwender möglichst
wenig Aufwand bei der Integration entsteht, und diese somit so einfach wie möglich
erfolgen kann.
4.4 Konfigurierbarkeit
Folgende Tabelle gibt einen Überblick über die Konfigurierungsmöglichkeiten der
einzelnen Plug-Ins. Die äußerst linke Spalte gibt den Namen des Plug-Ins an, die
Spaltenüberschriften die Art der Konfiguration. Dabei bedeutet:
•
•
•
•
•
•
Generierung, Installation in die Anwendung
Das Ergebnis der Installation kann durch Angabe von Parametern beeinflusst
werden.
Tabelle
Durch Änderungen in der Migrationsdatei 36 wird das Model konfiguriert (z.B.
indem Attribute geändert werden).
Model-Ebene
Das Model wird durch Parameter direkt im Model geändert.
Model erweitern
Ein Model wird durch das Plug-In erweitert (z.B. über acts_as_...).
Integration
Konfiguration durch die Art der Integration in die Anwendung.
Konfig.- Datei
Das Plug-In kann durch eine externe Konfigurationsdatei konfiguriert werden.
36
Die Versionierung des Datenbank-Schemas erfolgt in Rails über Migrationen. In (Fischer 2008, S.
41) wird eine Migration wie folgt beschrieben: "Migrationen sind kleine Ruby-Programme, die eine
Datenbank von einer Version in die nächst höhere oder niedrigere 'befördern'."
2009-09-10
39/107
Beschreibung der Lösungsidee
Wie die Konfigurierung im Detail erfolgt, wird im Abschnitt 5.2 beschrieben.
Generierung,
Installation
Tabelle
ModellEbene
Modell
erweitern
Integration
9
Basisprojekt
9
cmi_virtual_me
9
9
9
9
cmi_user_gallery
cmi_buddy_list
Simple Groups
9
cmi_embedded_chat
cmi_coll_session
cmi_interactive_user_info
9
9
Attachment Fu
cmi_room
9
9
9
9
cmi_remote_subscription
9
9
9
Juggernaut
9
Tabelle 15: Konfigurationsmöglichkeiten der Plug-Ins
acts_as_versioned
Konfig.Datei
9
9
9
4.5 Synchronizität
Als Basis für die Umsetzung der Entwurfsmuster, die Synchronizität erfordern, wurde
aufgrund der Ergebnisse der Untersuchung (siehe Abschnitt 3.1) das Plug-In
Juggernaut ausgewählt.
Folgende Entwurfsmuster beinhalten synchrone Komponenten, die mit Juggernaut
umgesetzt wurden:
• Buddy List
• Spontaneous Collaboration
• Bell
• Invitation
• Embedded Chat
• User List
• Collaborative Session
Alle Plug-Ins, die eine optionale Abhängigkeit zu Juggernaut besitzen, können auch
ohne Juggernaut verwendet werden. Dann ist das Verhalten der Plug-Ins asynchron.
4.6 Modelle
Da Rails- Anwendungen nach dem MVC Pattern aufgebaut sind, werden auch in
dieser Arbeit die Daten der Plug-Ins durch Models repräsentiert.
Folgende Abbildung zeigt die Modelle der Plug-Ins, und deren Beziehungen
zueinander. Aus Gründen der Übersichtlichkeit sind nur die Modelle der neu
2009-09-10
40/107
Beschreibung der Lösungsidee
entwickelten Plug-Ins abgebildet, jene der Plug-Ins aus externen Quellen wurden
nicht berücksichtigt.
Eine detaillierte Beschreibung der Architektur, und der Modelle, befindet sich im
Abschnitt 5.2, in der Beschreibung der einzelnen Plug-Ins.
Abb. 16: Modelle und deren Beziehungen zueinander
2009-09-10
41/107
Details zur Lösung
5 Details zur Lösung
In diesem Kapitel wird auf die Realisierung der einzelnen Entwurfsmuster
eingegangen.
5.1 Allgemein
Zunächst werden die Anforderungen an das System definiert, danach wird die
Installation der Komponenten auf dem System beschrieben, und im Anschluss daran
werden die getroffenen Sicherheitsmaßnahmen kurz vorgestellt.
Anforderungen an das System
Die CMI Plug-Ins können unabhängig vom Basisprojekt verwendet werden. Einzige
Vorbedingung ist, dass das bestehende Projekt eine Benutzertabelle mit dem Namen
user und einem Schlüssel id besitzt, und dass das Projekt eine sessions Tabelle hat.
Weiters müssen die Methoden des Moduls AuthenticatedSystem des Plug-Ins
Restful Authentication zur Verfügung stehen 37.
Die gesamte Anwendung wurde unter Microsoft Windows XP entwickelt. Als UnixPlattform wurde Ubuntu 8.10 verwendet.
Alle Module wurden mit den Browsern Firefox 3.0.8 und Chrome 1.0.154 getestet.
Als Rails Version wurde 2.2.2 zusammen mit Ruby 1.8.6 verwendet.
Generell wird vorausgesetzt, dass der verwendete Webbrowser so konfiguriert ist,
dass Javascript aktiviert ist.
Installation
Eine nähere Beschreibung zur Installation von Cooperation ist im Abschnitt 5.2.1 zu
finden.
Die Installation des Verzeichnisses cmi, das die implementierten Plug-Ins beinhaltet,
kann einfach per copy/paste in das plugins Verzeichnis der Zielanwendung erfolgen.
Wie die Module im Einzelnen installiert werden, ist in der Dokumentation des
entsprechenden Moduls nachzulesen.
Sicherheit
Die Benutzerverwaltung und Authentisierung wurde in der Basisanwendung mittels
des Plug-Ins Restful Authentication implementiert.
Der Login Zustand des Benutzers wird über den Before Filter in der Datei
application.rb global für die Anwendung überprüft.
37
Genauer gesagt werden im gesamten Projekt davon nur die Methoden logged_in?,
:login_required und current_user verwendet.
2009-09-10
42/107
Details zur Lösung
Die Sicherheitsabfragen für die einzelnen Module erfolgen über Before Filter in den
jeweiligen Controllern.
Die Definition eines Administrators kann in der Datei application.rb über die
Methode is_admin? erfolgen.
5.2 Realisierung der Entwurfsmuster
Es folgt nun die Beschreibung des Basisprojekts und der Plug-Ins, und wie die
entsprechenden Entwurfsmuster implementiert wurden. Jeder Abschnitt ist
üblicherweise wie folgt aufgebaut:
• Abhängigkeiten
Zu Beginn zeigt ein Paketdiagramm die erforderlichen, und optionalen
Abhängigkeiten auf. Die optionalen Abhängigkeiten sind durch das Stereotyp
<<optional>> gekennzeichnet, ausgelagerte Plug-Ins sind grau hinterlegt, und
Plug-Ins aus externen Quellen sind gepunktet dargestellt (siehe auch 4.2).
• Beschreibung
Hier erfolgt eine allgemeine Beschreibung des Moduls.
• Generierung und Installation in die Anwendung
Unter diesem Punkt wird beschrieben, wie die Komponenten des Plug-Ins
generiert werden, und wie diese in die Anwendung installiert werden. Hier werden
auch die Optionen, die der jeweilige Generator anbietet, vorgestellt.
• Integration in die Anwendung
Nachdem das Plug-In installiert wurde, können dessen Komponenten in die
Anwendung integriert werden. Wie diese Integration erfolgt, wird hier
beschrieben.
• Implementierung
In diesem Abschnitt wird auf einige Implementierungsdetails näher eingegangen.
5.2.1 Basisprojekt (Quick Registration, Login, Quick Goodbye)
Abhängigkeiten
Das Basisprojekt besitzt Abhängigkeiten zu den externen Plug-Ins Restful
Authentication und acts_as_state_machine.
Abb. 17: Basisprojekt Abhängigkeiten
2009-09-10
43/107
Details zur Lösung
Beschreibung
Das Basisprojekt basiert auf dem Plug-In Restful Authentication. Näheres zur
Benutzung von Restful Authentication ist in dessen Benutzerdokumentation auf
http://agilewebdevelopment.com/plugins/restful_authentication beschrieben.
Generierung und Installation in die Anwendung
•
Anwendung in das Zielverzeichnis kopieren
Die Basisanwendung kann direkt aus dem Repository in das Zielverzeichnis
kopiert werden, es sind keine weiteren Schritte für die Installation notwendig,
wenn die Anforderungen an das System erfüllt sind.
•
Datenbank erzeugen
Nachdem das Projekt ins Zielverzeichnis kopiert wurde (bzw. ins Zielprojekt
integriert wurde), muss die Datenbank für die Benutzer und die Sessions erzeugt,
und migriert werden.
Dies wird unter MS Windows durch rake db:create RAILS_ENV=production 38
mit anschließendem rake db:migrate erreicht.
•
Server
Um die Anwendung zu verwenden, muss zuerst der Rails-Server gestartet werden.
Das wird durch den Aufruf von ruby script\server erreicht. Der Server läuft,
auf dem Rails default Port 3000.
•
Konfigurierung
Die Anwendung kann, wie in Rails üblich, über die Datei environment.rb
konfiguriert werden.
Benutzung
Nach der Installation des Projekts sollte der ActionMailer 39 so konfiguriert werden,
dass das Versenden von Emails möglich ist. Damit die versendeten Links stimmen,
sollte die Konstante YOURSITE in der Datei user_mailer.rb angepasst werden.
Die Registrierung eines neuen Benutzers (Quick Registration) erfolgt über die
Action signup 40. Nach Eingabe der Daten wird eine Email mit einem Aktivierungslink
an die angegebene Adresse gesendet (ein Aktivierungslink ist nach folgendem
Schema aufgebaut: http://hostname:port/activate/activation_code). Nachdem der
Account aktiviert wurde, kann sich der neue Benutzer über die Action login einloggen
(Login).
Für den Logout steht die Action logout zur Verfügung.
38
Da die gesamte Anwendung unter MS Windows entwickelt wurde, wird für die Beschreibungen
jeweils die Syntax für MS Windows verwendet.
39
ActionMailer ist Bestandteil des Rails Frameworks und wird in diesem Projekt zum Versenden von
Emails verwendet. Die Konfigurierung des ActionMailers erfolgt über die Datei environment.rb.
40
Der vollständige Link für den Aufruf lautet somit z.B. http://localhost:3000/signup
2009-09-10
44/107
Details zur Lösung
Über forgot_password kann ein neues Passwort angefordert werden.
Soll der Account gelöscht werden (Quick Goodbye), so kann dies durch Aufruf von
set_deleted erreicht werden. Der Account wird in der Datenbank als gelöscht
markiert, und der Benutzer ist nach dem nächsten Logout gesperrt. Der Account wird
wird jedoch nicht gelöscht. Dies hat den Vorteil, dass bestehende Referenzen auf den
Account, wie z.B. auf dessen Virtual Me, gültig bleiben, und nicht verwaisen.
Über main gelangt man auf die Hauptseite, auf der auf einfache Art und Weise
Beispielcode für die meisten CMI Plug-Ins eingebunden werden kann.
5.2.2 Plug-In cmi_virtual_me (Virtual Me, Availability Status)
Abhängigkeiten
Das Plug-In cmi_virtual_me besitzt eine direkte Abhängigkeit zum externen Plug-In
acts_as_state_machine, da der Availability Status des Users als State Machine 41
realisiert wurde.
Die optionale Abhängigkeit zu cmi_interactive_user_info wird lediglich zur
Einstellung des Availability Status durch den Benutzer benötigt.
Abb. 18: cmi_virtual_me Abhängigkeiten
5.2.2.1 Virtual Me
Beschreibung
Das Modul cmi_virtual_me ist ein Plug-In nach dem acts_as... Prinzip - das heißt, ein
Model (in diesem Fall ein User) kann durch das Einfügen von acts_as_virtual_me
erweitert werden, man erhält somit direkt über den User, der erweitert wurde, Zugriff
auf die acts_as_virtual_me Attribute und Methoden. Es wird vorausgesetzt, dass
der User (bzw. das Model, das erweitert wird), das Attribut user_id besitzt.
41
Eine State Machine ( Zustandsmaschine) ist ein Modell des Verhaltens, bestehend aus Zuständen,
Zustandsübergängen und Aktionen. (Wikipedia 2009a)
2009-09-10
45/107
Details zur Lösung
Generierung und Installation in die Anwendung
Der Aufruf von ruby script\generate cmi_virtual_me kopiert die
entsprechenden Dateien in das Anwendungsverzeichnis und generiert eine
Migrationsdatei, die die entsprechende Tabelle erzeugt, nachdem die Migration
mittels rake db:migrate durchgeführt wurde.
Über den Parameter --skip-migration kann das Erzeugen der Migration
übersprungen werden.
Zusätzlich wird das Plug-In cmi_user_avatar automatisch mit installiert, falls es noch
nicht vorhanden ist. Die Assoziation zwischen CmiUserAvatar und User muss
jedoch ggf. noch manuell im User Model, durch Einfügen der Zeile has_one
42
:cmi_user_avatar im User Model, definiert werden , da es nicht möglich ist, die
Relationen zwischen den Tabellen aus dem Datenbankschema zu bestimmen
(Hansson 2009, S. 358). Im Anschluss daran muss noch im Model, das erweitert
werden soll, die Zeile acts_as_virtual_me eingefügt werden.
Integration in die Anwendung
Wird das Modul installiert, so wird eine neue Tabelle in der Datenbank angelegt.
Diese Tabelle enthält die Attribute, um die der User erweitert werden soll.
Soll der User um andere Attribute als die vorgegebenen erweitert werden, kann dies
direkt in der Migrations-Datei erfolgen. Die Spalten user_id und state werden
jedoch vom Plug-In selbst benötigt, und dürfen somit nicht gelöscht werden.
Die Attribute von Virtual Me können nun auf verschiedene Arten, wie im folgenden
Beispiel gezeigt, gelesen bzw. geschrieben werden (der Parameter a_user entspricht
dabei einem User):
•
lesen
<!-- get the attribute with the name 'country' -->
<%= a_user.get_virtual_me_attr('country') %>
<!-- get the attribute with the name 'country', use postfix '_vme'-->
<%= a_user.country_vme %>
•
schreiben
<!-- you can set multiple attributes via a hash -->
<%= a_user.set_virtual_me_attr(:country => 'Deutschland', :last_name =>
'Giesinger') %>
<!-- set the attribute 'country' to the value 'Deutschland' -->
<%= a_user.set_virtual_me_attr('country', 'Deutschland') %>
<!-- set attribute with the name 'country', use postfix '_vme' -->
<%= a_user.country_vme = 'Deutschland' %>
Benutzung - Nach Benutzerdaten suchen
Die Anforderung, dass Benutzer nach bestimmten Kriterien durchsucht werden
können sollen (siehe auch User Gallery), wurde im Plug-In cmi_virtual_me
42
Aus Gründen der Benutzbarkeit wurde hier, wie auch in den anderen Plug-Ins, darauf verzichtet, die
Assoziation durch den Generator in das assoziierte Model per default einzufügen.
2009-09-10
46/107
Details zur Lösung
implementiert. Dazu ruft man über den User die Methode find_string_in_users
auf, und übergibt den Suchstring und ein Array mit den Spalten, die durchsucht
werden sollen. Die Spalten können sich dabei sowohl in der users-, als auch in der
cmi_virtual_me- Tabelle befinden. Rückgabewert ist ein Array mit den Usern, in
denen der gesuchte String gefunden wurde. Die Spaltennamen müssen deshalb als
Parameter mit übergeben werden, damit die Suche durch den Anwendungsentwickler
auf bestimmte Spalten eingegrenzt werden kann.
Anwendungsbeispiel
search_string = 'd.b'
columns = ['login', 'email', 'first_name', 'last_name']
found_users = User.find_string_in_users(search_string, columns)
Benutzung - Benutzerdaten editieren
Die View für das Editieren der Benutzerdaten (cmi_virtual_me_edit.html.erb) wird
vom Generator in das Verzeichnis cmi_general installiert.
Diese View kann standardmäßig über die Interactive User Info, oder über den Link
/cmi_virtual_mes/edit/user_id aufgerufen werden. Sie stellt sowohl die Möglichkeit,
die User Attribute (wie Email und Avatar), als auch die Virtual Me Attribute zu
editieren, zur Verfügung. Wird ein neues Bild für den User Avatar ausgewählt, wird
dieses Bild nach dem Betätigen des Buttons Update User zum Server übertragen, und
dort im Verzeichnis public\cmi_user_avatars\user_id\version abgespeichert.
Abb. 19: Virtual Me mit aufgeklapptem Tooltip und Edit user data
2009-09-10
47/107
Details zur Lösung
5.2.2.2 Availability Status
Dieses Entwurfsmuster ist ebenfalls im Plug-In cmi_virtual_me implementiert.
Beschreibung
Der Benutzer kann seinen Availability Status einstellen, dieser Status ist für andere
Benutzer sichtbar.
Integration in die Anwendung
Die Aktualisierung des Availability Status kann über einen Before Filter erfolgen,
der die Class Method update_session des CmiHelper Moduls aufruft. Es empfiehlt
sich, einen solchen Filter überall da einzufügen, wo Benutzeraktionen erfolgen, sowie
beim Logout, so wie dies im Basisprojekt bereits implementiert ist (siehe z.B.
destroy
Methode im sessions_controller.rb bzw. before_filter im
main_controller.rb).
Beispiel:
• Einen Before Filter definieren:
•
before_filter :update_session
die dazu gehörende Methode sieht so aus:
def update_session
CmiHelper.update_virtual_me(session, new_state)
end
Benutzung
Der Availability Status kann durch den Benutzer über die Interactive User Info
eingestellt werden.
Abb. 20: Availability Status
Es gibt jedoch auch Availability States, die nicht vom Benutzer selbst eingestellt
werden, sondern durch die Applikation. Beispiele dafür sind online/offline, diese
werden von der Anwendung eingestellt, wenn sich ein Benutzer ein- bzw. ausloggt.
Ein Spezialfall ist der Status away, dieser kann einerseits durch den Benutzer selbst
gewählt werden, andererseits wird der Status automatisch gesetzt, wenn ein Benutzer
über einen bestimmten Zeitraum hinweg inaktiv ist.
Implementierung
2009-09-10
48/107
Details zur Lösung
Wird beim Aufruf von update_virtual_me für new_state einer der definierten
Availability States angegeben, so wird der gewünschte Status eingestellt, sofern
erlaubt. Wird als new_state ein leerer String angegeben, so wird in der Class Method
update_virtual_me_state der Klasse CmiVirtualMesController versucht, den
Status automatisch zu bestimmen.
Die Methode update_virtual_me hat die zusätzliche Funktion, dass für jeden User
ein Virtual Me in der Datenbank angelegt wird, falls dieser noch nicht vorhanden ist.
Der Availability Status selbst wird in der Tabelle cmi_virtual_mes in der Spalte
state abgespeichert.
Die Zustände und Zustandsübergänge sind als State Machine mit dem Plug-In
acts_as_state_machine im Model CmiVirtualMe realisiert.
Abb. 21: Availability State Zustandsdiagramm
Sollen neue bzw. andere Zustände definiert werden, so kann das direkt in den Klassen
CmiVirtualMeController und CmiVirtualMe im Code geändert werden, dies erfolgt
über die in acts_as_state_machine übliche Syntax (siehe Abschnitt 5.3.4).
Das Plug-In acts_as_state_machine wurde um Methoden erweitert, die es
ermöglichen, alle bzw. alle möglichen Folgezustände vom momentanen Zustand aus
zu ermitteln. Diese Folgezustände können dann direkt, oder noch zusätzlich gefiltert,
verwendet werden, um z.B. über Links einen Zustandsübergang auszulösen. Diese
Lösung funktioniert unabhängig von den definierten Zuständen und macht die
Anwendung deshalb besonders flexibel.
Anwendungsbeispiel
Durch folgenden Code werden von einem gegebenen Zustand aus die möglichen
Folgezustände ermittelt, und als Links in die Anwendung eingefügt:
1. <% possible_states =
virtual_me.possible_events_from_state(virtual_me.state) %>
2. <% possible_states = CmiVirtualMesController.filter_states
(possible_states, virtual_me.state) %>
3. <% possible_states.each do |state_to_set| %>
4.
<%= link_to state_to_set.to_s, :controller => "cmi_virtual_mes",
:action => "do_" + state_to_set.to_s,
:params => { :the_user => the_user } %>
5. <% end %>
2009-09-10
49/107
Details zur Lösung
Ausgehend vom Zustand online und dem in Abb. 21 dargestellten Zustandsdiagramm,
ergibt sich folgender Programmablauf:
In Zeile 1 werden zunächst vom aktuellen Zustand eines virtual mes aus die
möglichen Folgezustände ermittelt, und der Variablen possible_states zugewiesen.
Der Inhalt von possible_states ist nun :away, :offline, :busy.
Danach werden in Zeile 2 die Zustände gefiltert, denn nicht alle möglichen
Folgezustände sollen durch den Benutzer eingestellt werden können. Der Inhalt von
possible_states ist dann :away, :busy.
Diese Zustände werden danach über den Code der Zeilen 4 und 5, in der View als
Links dargestellt, siehe dazu Abb. 20 oben.
5.2.3 Plug-In cmi_user_gallery (User Gallery)
Abhängigkeiten
Das Plug-In cmi_user_gallery besitzt direkte Abhängigkeiten zu den Plug-Ins Tooltips
und cmi_user_avatar, wobei das Plug-In cmi_user_avatar automatisch mit installiert
wird, falls es noch nicht vorhanden ist.
Die optionale Abhängigkeit zu cmi_virtual_me ist erforderlich, falls nach Daten in der
User- bzw. der Virtual Me Tabelle gesucht werden können soll.
Abb. 22: cmi_user_gallery Abhängigkeiten
Beschreibung
Die User Gallery zeigt alle Benutzer einer Anwendung an, egal, ob sie gerade aktiv
sind, oder nicht.
Generierung und Installation in die Anwendung
Mit ruby script\generate cmi_user_gallery werden die erforderlichen Dateien
in das Anwendungsverzeichnis kopiert.
Zusätzlich wird das Plug-In cmi_user_avatar automatisch installiert, falls es noch
nicht vorhanden ist. Der optionale Parameter --skip-migration verhindert das
Erzeugen der Migrationsdatei.
Die Assoziation zwischen CmiUserAvatar und User (has_one :cmi_user_avatar)
muss noch manuell im User Model definiert werden.
2009-09-10
50/107
Details zur Lösung
Integration in die Anwendung
Das Modul kann in die Anwendung eingebunden werden, indem das Partial
_cmi_user_gallery.html.erb an der gewünschten Stelle in eine View eingefügt wird.
Über den Aufruf kann der Inhalt des angezeigten Tooltips durch die Übergabe von
Parametern für externe Links (ext_links) konfiguriert werden, wobei der Aufruf
mit- oder ohne Parameter erfolgen kann:
•
Beispiel 1: Aufruf ohne Parameter
Nur die per default definierten Inhalte und Links erscheinen im Tooltip.
Dies kann z.B. durch Einfügen folgender Zeile in die Datei index.html.erb
erfolgen:
<%= render(:partial => "cmi_general/cmi_user_gallery.html.erb" %>
•
Beispiel 2: Aufruf mit Parameter
Zusätzlich zu den per default definierten Inhalten und Links können Inhalte bzw.
Links über die Parameter beim Aufruf definiert werden.
Der User Gallery wird dabei beim Aufruf über den Parameter :locals ein String
übergeben, der auf ein Partial verweist, in dem diese zusätzlichen Inhalte definiert
sind. Diese Inhalte sind dann in der Anwendung über den Tooltip des Users in der
User Gallery aufrufbar:
<%= render(:partial => "cmi_general/cmi_user_gallery.html.erb",
:locals => {:ext_links =>
"/cmi_general/cmi_user_gallery_create_buddy_links.html.erb"}) %>
Da die Links zum Einfügen eines Benutzers in die Buddy List im per default
konfigurierten Partial cmi_user_gallery_create_buddy_links.html.erb implementiert
sind, wird empfohlen, die User Gallery mit dem passenden Parameter ext_links (wie
oben in Beispiel 2 gezeigt), aufzurufen.
Benutzung
Die User Gallery zeigt jeden User durch dessen Login Name und User Avatar an.
Hat ein Benutzer keinen Avatar definiert, so wird ein Standard- Bild angezeigt.
•
Aktionen mit anderen Benutzern über die User Gallery
Über die User Gallery sind Aktionen mit anderen Usern möglich. Per Mausklick
auf den entsprechenden User Avatar öffnet sich ein Tooltip, der die möglichen
Aktionen mit diesem Benutzer anbietet.
2009-09-10
51/107
Details zur Lösung
Abb. 23: User Gallery mit geöffnetem Tooltip
•
Nach Benutzerdaten suchen:
Das Plug-In cmi_virtual_me stellt die Methode find_string_in_users bereit,
die das Suchen nach Benutzerdaten ermöglicht. Soll also nach Benutzerdaten
gesucht werden können, so kann dies nur in Kombination mit cmi_virtual_me
erfolgen.
Implementierung:
Standardmäßig werden alle User aus der User Tabelle in der User Gallery angezeigt,
die sich im Status aktiv befinden (also nicht User, die noch nicht aktiviert sind, oder
User, die gesperrt wurden, siehe Quick Goodbye). Die Abfrage der aktiven Benutzer
erfolgt über die Methode filtered_users(user) im CmiHelper. Sollen also nur
bestimmte Benutzer angezeigt werden, so können die Benutzer an dieser Stelle bei
Bedarf beliebig gefiltert werden.
Die User Avatars sind im Plugin cmi_user_avatar realisiert, in der User Gallery
werden sie vom Partial _cmi_current_user.html.erb dargestellt.
Die Tooltips wurden mit dem Plug-In Tooltips realisiert, das natürlich für die
Verwendung der User Gallery zuerst installiert werden muss.
Weitere mögliche Benutzerinteraktionen können z.B. durch ein zusätzliches Partial
konfiguriert werden (siehe oben).
5.2.4 Plug-In cmi_buddy_list (Buddy List, Spontaneous
Collaboration)
Abhängigkeiten
Das Plug-In cmi_buddy_list besitzt direkte Abhängigkeiten zu den Plug-Ins
cmi_message, acts_as_state_machine, cmi_user_avatar (wird automatisch installiert)
und Tooltips.
Optionale Abhängigkeiten bestehen zu cmi_user_gallery (zum Hinzufügen bzw.
Entfernen von Benutzern zur eigenen Buddy List über das entsprechende Icon),
2009-09-10
52/107
Details zur Lösung
cmi_virtual_me (für den Availability Status) und Juggernaut (für das synchrone
Verteilen der Buddy Requests).
Abb. 24: cmi_buddy_list Abhängigkeiten
Beschreibung
Die Namen der bekannten Benutzer (Friends, Buddies) werden in der Buddy List
zusammen mit ihrem Avatar und dem Availability State angezeigt. Des weiteren ist
die Buddy List ein Startpunkt für verschiedene Benutzerinteraktionen.
Generierung und Installation in die Anwendung
Alle erforderlichen Komponenten werden über den Aufruf ruby script\generate
cmi_buddy_list generiert und installiert. Es wird unter anderem eine Migration
angelegt, das kann jedoch durch Angabe des Parameters --skip-migration
übersprungen werden.
Das Plug-In besitzt eine Abhängigkeit zum Infrastruktur-Plug-In cmi_message. Soll
Buddy List ohne die vorherige Installation von cmi_message installiert werden, muss
der Parameter --skip-cmi-messages angegeben werden.
Zusätzlich wird das Plug-In cmi_user_avatar automatisch installiert, falls es noch
nicht vorhanden ist. Die Assoziation mit dem User Model (has_one
:cmi_user_avatar) muss jedoch noch manuell erfolgen.
Wie immer, muss die Migration nach der Installation noch ausgeführt werden.
Die Views werden in das Verzeichnis /app/views/cmi_buddy_list installiert.
Integration in die Anwendung
Die users und cmi_buddy_lists stehen in einer 1:n Beziehung zueinander, wobei
die Einträge in der cmi_buddy_lists Tabelle den Buddies der User entsprechen. Vor
2009-09-10
53/107
Details zur Lösung
der Verwendung muss diese Assoziation durch das Einfügen von has_many
:cmi_buddy_lists im User Model definiert werden.
Die Buddy List kann durch Einfügen des Partials _cmi_buddy_list.html.erb in eine
View eingebunden werden. Die anzuzeigenden Buddies und zusätzliche, über den
Tooltip der Buddy List aufrufbare Links, sind dabei über den Aufruf konfigurierbar.
Beispiel für die Verwendung der View:
Das Partial wird in der Datei index.html.erb des Basisprojekts wie folgt eingefügt:
<% the_user_ids = CmiHelper.get_buddy_ids_by_conditions(current_user,
"state == 'confirmed'")%>
<%= render(:partial => "cmi_buddy_list/cmi_buddy_list.html.erb",
:locals => {:ext_links =>
"/cmi_buddy_list/cmi_buddy_list_default_links.html.erb",
:the_user_ids => the_user_ids}) %>
Konfigurierung
Der Inhalt der Buddy List View ist über den Parameter :locals beim Aufruf
folgendermaßen konfigurierbar:
• the_user_ids:
Ein Array, welches die User ids der Buddies enthält, die in der Buddy List
angezeigt werden sollen.
• ext_links:
Ein String, der auf ein Partial verweist, in dem zusätzliche externe Links oder
sonstige Inhalte definiert sind, die dann in der Anwendung über den Tooltip des
Users in der Buddy List aufrufbar sind.
Wird dieser Parameter nicht angegeben, so erscheinen keine zusätzlichen Links.
Abb. 25: Buddy List mit geöffnetem Tooltip
Der Availability Status wird nur angezeigt, wenn das Modul Virtual Me installiert ist.
2009-09-10
54/107
Details zur Lösung
Benutzung
Möchte ein Benutzer einen anderen Benutzer in seine eigene Buddy List aufnehmen,
so klickt er auf das Icon des anderen Benutzers in der User Gallery, und wählt dort
den Link Add to Buddies.
Der andere Benutzer erhält nun eine Mitteilung über die Kontaktaufnahme per Email
und über Juggernaut. Ist der andere Benutzer mit der Anfrage einverstanden, und
möchte den Benutzer in seine Buddy List aufnehmen, so kann er den zusammen mit
der Nachricht verschickten Aktivierungslink aufrufen. Nun werden beide Benutzer in
die jeweilige Buddy List eingetragen.
Möchte einer der Beiden die Freundschaft aufkündigen, so kann er dies über den
entsprechenden Link in der User Gallery, oder über den äquivalenten Link in der
Buddy List, erreichen. Beide Benutzer werden dann aus beiden Listen entfernt.
Die Buddy List ist der ideale Startpunkt für Spontaneous Collaboration mit anderen
Benutzern.
Implementierung
Der Prozess wie zwei Benutzer miteinander sich miteinander befreunden (Buddies
werden), wird durch eine State Machine abgebildet. Die State Machine ist durch
acts_as_state_machine realisiert. Folgende Zustände sind möglich: new, requested,
confirmed, declined.
Abb. 26: Buddy List Zustandsdiagramm
Wenn eine Buddy Anfrage erfolgt, und es existiert noch kein passender Eintrag in der
cmi_buddy_lists Tabelle der Datenbank, so wird ein neuer Eintrag mit dem Zustand
new angelegt, und durch einen Request-Event sofort in den Zustand requested
überführt. Von da aus kann er durch Aufruf eines Aktivierungslinks mit dem richtigen
activation_code in den Zustand confirmed überführt werden. Von confirmed kann er
unter anderem in den Zustand declined überführt werden.
Beispiel für einen Aktivierungslink:
http://localhost:3000/cmi_buddy_lists/do_confirm/f86e103587afad45734f99446a9e24
721caf2599
Der Availability State der Buddy List aktualisiert sich in einem periodischen Zeitraum
selbst, dies ist über einen periodically_call_remote Aufruf realisiert. Das führt
dazu, dass der Availability Status der Buddies stets aktuell ist. Das Intervall der
2009-09-10
55/107
Details zur Lösung
Aktualisierung
ist
durch
das
:frequency
_cmi_buddy_list_users.html.erb einstellbar.
Attribut
im
Partial
Buddy List benötigt das Infrastruktur-Plug-In cmi_message für die Verteilung der
Buddy Request Messages an die Benutzer.
5.2.5 Plug-In Simple Groups (Group)
Abhängigkeiten
Simple Groups besitzt keine Abhängigkeiten zu anderen Plug-Ins.
Beschreibung
Benutzer sollen mit Gruppen wie mit anderen Benutzern agieren können, um z.B.
allen Gruppenmitgliedern eine Nachricht zukommen zu lassen.
Plug-In installieren
Dieses Entwurfsmuster wird durch das externe Plug-In Simple Groups realisiert.
Die Homepage von Simple Groups ist im Web unter dem Link
http://agilewebdevelopment.com/plugins/simple_groups zu finden, die Quellen befinden sich auf GitHub (http://github.com/JonMidhir/simple_groups/tree/master).
Die Installation auf einem Unix System erfolgt wie in der Installationsanleitung auf
der Homepage beschrieben. Für die Installation auf MS Windows muss zuerst ein
Zugang zu GitHub 43 geschaffen werden, danach kann die Installation des Plug-Ins
über ruby script\plugin install http://github.com/JonMidhir/simple
_groups.git/ erfolgen.
Generierung und Installation in die Anwendung
Die Installation erfolgt durch die Ausführung von ruby script\generate
simple_groups Group, der Parameter Group gibt dabei den Namen der Gruppe an,
und ist frei wählbar.
Weiters muss das User Model durch Group erweitert werden, dies wird durch das
Einfügen von include_simple_groups im User Model erreicht.
Danach muss noch die Migration durchgeführt werden.
43
GitHub ist ein, in der RoR Community sehr beliebtes, Version Control System. Dessen Homepage
lässt sich über den Link http://github.com/ aufrufen.
Eine Beschreibung, wie GitHub unter MS Windows verwendet werden kann, befindet sich im Anhang.
2009-09-10
56/107
Details zur Lösung
Integration in die Anwendung
Das Plug-In bringt keine Views, und keinen Controller mit, sämtliche Methoden
werden direkt über das erweiterte Model zur Verfügung gestellt (z.B. user.group).
Eine Auflistung aller Methoden ist auf der Homepage des Plug-Ins zu finden.
5.2.6 Plug-In Attachment Fu (Shared File Repository)
Abhängigkeiten
Attachment Fu besitzt für die Bildverarbeitung Abhängigkeiten zu den externen
Komponenten ImageMagic und MiniMagick, wobei anstatt diesen optional auch
andere Programme verwendet werden können.
Abb. 27: Attachment Fu Abhängigkeiten
Beschreibung
Den Benutzern soll das Handling mit Dateien ermöglicht werden, es sollen Dateien
über ein gemeinsam genutztes File Repository ausgetauscht werden können.
Shared File Repository wird unter Verwendung des externen Plug-Ins Attachment
Fu umgesetzt.
Installation
Attachment
Fu
wird
über
den
Befehl
ruby
script\plugin
install
http://svn.techno-weenie.net/projects/plugins/attachment_fu/ installiert.
Das Plug-In benötigt für die Bildverarbeitung noch zusätzliche Komponenten. Eine
Beschreibung
dazu
befindet
sich
im
Web
unter
dem
Link
http://clarkware.com/cgi/blosxom/2007/02/24#FileUploadFu, eine kurze Beschreibung für die Installation von MiniMagick auf MS Windows ist im Anhang zu finden.
Integration in die Anwendung
Für die Integration in die Anwendung wird allgemein folgende Vorgehensweise
empfohlen:
• Model und Migration erstellen
• Controller erstellen
• View für den File Upload erstellen
2009-09-10
57/107
Details zur Lösung
•
View für die Anzeige der Dateien erstellen
Die Konfigurierung erfolgt über Parameter direkt im Model.
Ein interessantes Tutorial zur Verwendung von Attachment Fu befindet sich auf der
Seite http://clarkware.com/cgi/blosxom/2007/02/24#FileUploadFu.
Da das Plug-In cmi_user_avatar unter Verwendung von Attachment Fu implementiert
wurde, kann die Verwendung dieses Plug-Ins am Beispiel von cmi_user_avatar
nachvollzogen werden.
Implementierung
Das
Plug-In
bietet
zahlreiche
Konfigurationsmöglichkeiten,
die
durch
has_attachment im entsprechenden Model deklariert werden können.
An dieser Stelle werden nur einige davon erwähnt:
•
:content_type
•
:thumbnails
Legt fest, welche Datentypen gespeichert werden können.
Es können auch Thumbnails der Dateien gespeichert bzw. angezeigt werden. Hier
bietet das Plug-In weitere Optionen.
•
:storage
Die Daten können wahlweise auf dem Filesystem, in einer Datenbank oder aber
auch auf einem Amazon Simple Storage Service (S3) 44 abgespeichert werden.
•
:path_prefix
Der Pfad-Prefix des Orts, an dem sich die Dateien auf dem Server befinden.
Attachment Fu speichert die Dateien per default in Unterverzeichnissen ab, die nach
der id der Datei benannt sind. Das kann sich je nach Anwendungsfall als störend
erweisen. Eine Anleitung um dieses Verhalten zu umgehen, befindet sich unter
folgendem Link:
http://almosteffortless.com/2007/03/25/working-with-attachment_fu/.
Soll zusätzlich eine Versionierung der Artefakte erfolgen, so kann dies durch das
Plug-In acts_as_versioned realisiert werden.
5.2.7 Plug-In cmi_room (Room, Bell, Invitation, Spontaneous
Collaboration, User List, Interaction Directory)
Abhängigkeiten
Das Plug-In cmi_room besitzt direkte Abhängigkeiten zu den Plug-Ins
cmi_buddy_list, cmi_message und acts_as_state_machine.
Eine optionale Abhängigkeit besteht zu Juggernaut, für die synchrone Verteilung der
Nachrichten.
44
Amazon S3: siehe http://aws.amazon.com/s3/
2009-09-10
58/107
Details zur Lösung
Abb. 28: cmi_room Abhängigkeiten
Beschreibung
Für die kollaborative Gruppenarbeit wird ein Raum zur Verfügung gestellt. Dieser
Raum bietet alle Optionen an, die für die Gruppenarbeit benötigt werden.
Generierung und Installation in die Anwendung
Das Plug-In wird über den Aufruf von ruby script\generate cmi_room users
installiert. Der Parameter users gibt, ähnlich wie bei der Installation von
cmi_interactive_user_info, die User Tabelle an. Als weiterer Parameter kann --skipmigration angegeben werden.
Das Plug-In benötigt das Infrastruktur-Plug-In cmi_message, soll cmi_room ohne die
vorherige Installation von cmi_message installiert werden, kann dies durch Angabe
des Parameters --skip-cmi-messages erreicht werden.
Nach der Ausführung der Migration muss das User Model noch mit CmiRoom
assoziiert werden, bevor es verwendet werden kann. Dies erfolgt durch das Einfügen
folgender Zeile im User Model: has_and_belongs_to_many :cmi_rooms.
Integration in die Anwendung
Um cmi_room zu verwenden, genügt es, die View cmi_room.html.erb wie folgt an der
gewünschten Stelle (z.B. in der Datei main/index.html.erb) einzubinden:
<%= render(:partial => "cmi_rooms/cmi_room.html.erb") %>
Ähnlich wie bei cmi_buddy_list werden Mitteilungen über Änderungen in den
Räumen über den ActionMailer, und über Juggernaut durch das Plug-In
cmi_message, verschickt.
2009-09-10
59/107
Details zur Lösung
Benutzung
•
Verwalten von Räumen
Räume können erstellt, geändert und gelöscht werden, wobei derjenige Benutzer,
der einen Raum erstellt hat, automatisch auch der Besitzer des Raums ist, und als
einziger (neben dem Administrator) seine Räume editieren und löschen kann.
Dies alles geschieht über die View cmi_manage_rooms.html.erb.
Diese View dient somit auch als Interaction Directory.
Einen neuen Raum erstellen
Nachdem die View zum Erstellen eines neuen Raums geöffnet wurde, können
über die Buddy List Benutzer in einen Raum eingeladen werden. Der Besitzer des
Raums ist automatisch auch ein Mitglied des Raums.
Bevor der Raum über den Button Create room erzeugt werden kann, muss dem
Raum noch ein Name gegeben werden, dieser Name muss innerhalb aller aktiven
Räume eindeutig sein.
Nachdem der Raum erzeugt wurde, wird eine Mitteilung an alle Mitglieder des
Raums gesendet.
Einen Raum editieren
Über den entsprechenden Link erreicht der Benutzer die View zum Editieren eines
Raums, von dieser View aus können Mitglieder zum Raum hinzugefügt, oder
entfernt werden.
Werden die Änderungen gespeichert, so wird wiederum eine Mitteilung an alle
Mitglieder des Raums gesendet.
Einen Raum löschen
Über den entsprechenden Link kann ein Raum vom Besitzer gelöscht werden.
Dieser Raum kann nicht wieder aktiviert werden, obwohl er nicht gelöscht,
sondern nur in den Zustand closed versetzt wird. Der Grund dafür ist, dass ein
Raumname nur einmalig in der Anwendung vorkommen darf, und Namen von
Räumen, die im Zustand closed sind, wieder neu vergeben werden können.
Mitglied eines Raums werden
Über den Link Ring the Bell kann man dem Administrator eines Raums eine
Mitteilung zukommen lassen, und ihn so bitten, sich in den entsprechenden Raum
einzuladen (Bell).
2009-09-10
60/107
Details zur Lösung
Abb. 29: Manage Rooms
•
Betreten eines Raums, User List
Jedes Mitglied kann einen Raum betreten, dazu muss es nur den entsprechenden
Link in der View cmi_my_rooms.html.erb aufrufen.
In einem Raum werden sowohl sämtliche Mitglieder des Raums (über eine Buddy
List des aktuellen Raums), als auch alle Mitglieder, die sich gerade im Raum
befinden (User List), angezeigt. Beide Views zeigen ständig den aktuellen
Zustand an.
Abb. 30: User List
Die User List bietet zusammen mit der Buddy List des Raums einen Startpunkt
für Spontaneous Collaboration mit anderen Benutzern.
•
Andere Benutzer in einen Raum einladen
Befindet sich ein Benutzer in einem Raum, so kann er andere Benutzer in diesen
Raum einladen (Invitation). Dies erfolgt über einen Link im entsprechenden
Raum. Der eingeladene Benutzer erhält dann eine Nachricht über diese Einladung,
die Nachricht enthält einen Link auf den entsprechenden Raum. Der eingeladene
Benutzer ist dann auch automatisch Mitglied dieses Raums.
2009-09-10
61/107
Details zur Lösung
Implementierung
Rooms und Users stehen in einer n:m Beziehung zueinander, dies ist über die JoinTabelle cmi_rooms_users realisiert.
Ein Raum kann die States new, active und closed einnehmen, die States wurden durch
das Plug-In acts_as_state_machine realisiert.
Folgende Abbildung zeigt das Zustandsdiagramm, der Zustand new ist als
Startzustand definiert:
Abb. 31: CmiRoom Zustandsdiagramm
Die User List ist durch ein Partial _cmi_room_users_currently_in_room.html.erb
realisiert, das über einen periodical_call_remote Aufruf stets aktualisiert wird,
dessen Intervall kann durch den Parameter :frequency konfiguriert werden.
Beispiel für den Aufruf der User List:
<%= periodically_call_remote(:update => 'users_currently_in_room',
:url => { :controller => '/cmi_rooms',
:action => :show_users_currently_in_room,
:room_id => @room.id }, :frequency => 30 )%>
Jedes Mal, wenn die Action cmi_a_room des CmiRoomControllers aufgerufen wird,
wird die gesamte View cmi_a_room.html.erb bei allen Benutzern automatisch
aktualisiert, sofern Juggernaut installiert ist.
Wie in den anderen implementierten Entwurfsmustern, die Daten bearbeiten bzw. auf
Daten zugreifen, implementiert auch cmi_room das Entwurfsmuster Centralized
Objectses werden also sämtliche Artefakte zentral auf dem Server gespeichert, und
alle Benutzer des Raums greifen darauf zu, und können die Artefakte bearbeiten.
5.2.8 Plug-In cmi_message 45
Abhängigkeiten
Das Plug-In cmi_message besitzt für die Verteilung der Nachrichten optionale
Abhängigkeiten zum Plug-In Juggernaut und zum ActionMailer.
45
Dieses Plug-In implementiert kein Entwurfsmuster, sondern ist ein Teil der Infrastruktur, der separat
installiert wird.
2009-09-10
62/107
Details zur Lösung
Abb. 32: cmi_message Abhängigkeiten
Beschreibung
Das Plug-In cmi_message ist ein eigenständiges Modul, das die Infrastruktur für das
Versenden von Nachrichten zur Verfügung stellt. Es wird von mehreren CMI-PlugIns verwendet.
Generierung und Installation in die Anwendung
Das Plug-In wird über den Befehl ruby script\generate cmi_message installiert.
Folgende Parameter können beim generieren angegeben werden:
--without-juggernaut: Überspringt den Check, ob Juggernaut installiert ist.
--install-juggernaut: Führt das Install Script (install.rb) von Juggernaut aus,
siehe auch Installation von cmi_embedded_chat.
--skip-migration: Die Migration wird nicht angelegt.
Nach der Ausführung der Migration muss das User Model noch mit dem CmiMessage
Model assoziiert werden, das wird durch das Einfügen folgender Zeile im User Model
erreicht: has_many :cmi_messages
Integration in die Anwendung und Benutzung
Grundsätzlich muss zwischen automatisch generierten Nachrichten, die ggf. mit einer
benutzerdefinierten Nachricht versehen werden können, und von Benutzern erzeugten
Nachrichten (wie z.B. Emails) unterschieden werden.
Zu den automatisch generierten Nachrichten gehören unter anderem Buddy Requests
(siehe Plugin cmi_buddy_list), Ring Bell Requests und Room Invite Requests (beide
cmi_room).
Die automatisch generierten Nachrichten werden von der Anwendung an die
betreffenden Benutzer versendet, das Versenden erfolgt sowohl über Email, als auch
über Juggernaut. Ist Juggernaut nicht installiert, bzw. ist der Juggernaut Server nicht
gestartet, wird die Nachricht nur per Email versendet.
Die Nachrichten können über das Partial _cmi_message_board.html.erb, welches in
das Verzeichnis views/cmi_messages installiert wird, angezeigt werden. Dieses Partial
kann wie folgt in die Anwendung eingebunden werden:
<%= render(:partial => "cmi_messages/cmi_message_board.html.erb") %>
2009-09-10
63/107
Details zur Lösung
Folgende Abbildung zeigt das Message Board mit Nachrichten:
Abb. 33: Message Board aufgeklappt mit Anzeige einer neuen Nachricht
Realisierung
Alle Nachrichten werden in der Tabelle cmi_messages abgespeichert. Das Versenden
der Messages erfolgt einerseits von CmiMessage aus über den ActionMailer, und
andererseits jeweils direkt vom entsprechenden Controller aus über Juggernaut.
Vorteil der Juggernaut-Variante ist, dass der Empfänger der Nachricht über das
Message Board sofort eine Mitteilung über das Eintreffen der neuen Nachricht erhält,
und dass das Message Board über Juggernaut stets aktualisiert wird.
Eine Message wird durch das Model CmiMessage repräsentiert, die Message Typen
sind im Model über die Konstante TYPES definiert. Jede Message wird beim Erzeugen
mit einem Ablaufdatum versehen. Dieses Datum kann dazu verwendet werden, um
abgelaufene Messages zu filtern. Zudem steht das Attribut has_been_read zur
Verfügung, das ebenfalls dazu verwendet werden kann, um Nachrichten zu filtern.
5.2.9 Plug-In cmi_embedded_chat (Embedded Chat)
Abhängigkeiten
Das Plug-In cmi_embedded_chat besitzt direkte Abhängigkeiten zu den Plug-Ins
Juggernaut und cmi_juggernaut_connection, welches automatisch mit installiert wird.
Optional ist die Abhängigkeit zum Plugin cmi_buddy_list, dieses wird für den Aufruf
des Private Chats über die Buddy List benötigt.
2009-09-10
64/107
Details zur Lösung
Abb. 34: cmi_embedded_chat Abhängigkeiten
Beschreibung
Dieses Plug-In realisiert einen synchronen Chat zwischen beliebigen Benutzern,
wobei entweder ein privater Chatraum eröffnet werden kann, oder einer von mehreren
bereitgestellten, öffentlichen Chaträumen, verwendet werden kann. Ein privater Chatraum ist ein Chatraum, der von einem Benutzer erstellt wurde. Der Benutzer kann
andere Benutzer in diesen privaten Chatraum einladen, nur die jeweiligen Benutzer
haben Zugriff zu diesem Raum. Dies funktioniert unabhängig vom Plugin cmi_room.
Das Plug-In stellt die Komponenten für zwei unterschiedliche Anwendungsfälle zur
Verfügung, die je nach Bedarf eingesetzt werden können:
• Anwendungsfall 1: independent
Der Chat soll unabhängig von der Anwendung verwendet werden können.
Die für diesen Anwendungsfall bereitgestellten Komponenten lassen sich
unabhängig von der restlichen Anwendung verwenden. Die View zum Aufrufen
der Chats wird über einen separaten Link bereitgestellt.
• Anwendungsfall 2: integrated
Der Chat soll sich nahtlos in die anderen Module integrieren lassen.
Es werden Komponenten bereitgestellt, die sich in die anderen Module integrieren
lassen. Somit kann ein Chat an einer beliebigen Stelle in die Anwendung
eingebunden werden.
Generierung und Installation in die Anwendung
Beim Aufruf von ruby script\generate cmi_embedded_chat werden zunächst die
Komponenten für das Management der Juggernaut-Kanäle, die Komponenten von
cmi_juggernaut_connection, installiert.
Danach werden die eigentlichen Komponenten für den Chat in die Anwendung
installiert, wobei je nach Wunsch entweder alle Komponenten, oder wahlweise nur
die Komponenten für die Anwendungsfälle independent oder integrated installiert
werden. Dies wird über die Parameter --skip-integrated und --skipindependent gesteuert.
Zudem wird für cmi_juggernaut_connection eine Migration angelegt, die eine Tabelle
für die Verwaltung der Verbindungen erzeugt. Die Migration muss natürlich wie
immer über rake db:migrate ausgeführt werden, bevor das Modul verwendet
werden kann.
Über den Parameter --skip-migration kann das Erzeugen der Migration
übersprungen werden.
Der Parameter --install-juggernaut führt die install.rb von Juggernaut aus, somit
kann das Juggernaut Plug-In einfach in das plugins-Verzeichnis kopiert werden, und
der Generator von cmi_embedded_chat übernimmt die Installation von Juggernaut.
2009-09-10
65/107
Details zur Lösung
Integration in die Anwendung
Je nach Anwendungsfall erfolgt die Integration unterschiedlich:
•
Anwendungsfall independent
Die installierten Komponenten stehen mit den restlichen Modulen (außer den
Usern) nicht in Beziehung, und können deshalb unabhängig von der eigentlichen
Anwendung verwendet werden. Die Chaträume befinden sich in einer separaten
View, und werden über den Link /cmi_embedded_chat aufgerufen.
•
Anwendungsfall integrated
Hier werden öffentliche und private Chaträume unterschiedlich aufgerufen.
o Öffentliche Chaträume
Diese können vom Benutzer über das Chat Board aufgerufen werden. Das
Chat Board kann an einer beliebigen Stelle (z.B. im Layout), durch Einfügen
folgender Zeile, in die Anwendung eingebunden werden:
<%=render(:partial=>"cmi_embedded_chat/cmi_chat_board.html.erb")%>
o Private Chaträume
Diese werden vom Benutzer über die Buddy List, per Mausklick auf den Link
private chat, erzeugt. Dieser Link kann durch Einfügen folgender Zeile (z.B.
im Partial _cmi_buddy_list_default_links.html.erb) erstellt werden:
<%= link_to "Private chat",
{:controller => 'cmi_embedded_chat', :action => 'invite_private',
:params => { :client_id => a_user[:id],
:current_user_id => current_user.id } },
:popup => ['_blank','height=300,width=600,scrollbars=yes'] %><br/>
Da jeder private Chatraum bestimmten Benutzern zugeordnet ist, muss diese
Assoziation durch has_many :cmi_private_chat_rooms im User Model
deklariert werden.
Benutzung
Zunächst den Juggernaut Server über juggernaut -c juggernaut.yml starten, und
den Rails-Server starten.
•
Anwendungsfall independent
Die Startseite für den Chat kann über den Link /cmi_embedded_chat aufgerufen
werden. Von da aus können über die chatroom links die Chaträume betreten
werden. In diesen Räumen kann der Benutzer mit allen Teilnehmern, die sich
darin befinden, chatten.
Zudem gelangt der Benutzer über den Link Invite in einen privaten Chatraum, in
den er nun andere Benutzer einladen kann. Jeder eingeladene Benutzer erhält eine
Mitteilung auf seiner Chat-Hauptseite, und gelangt über einen Link, der in der
Mitteilung enthalten ist, ebenfalls in den entsprechenden Chatraum.
2009-09-10
66/107
Details zur Lösung
•
Anwendungsfall integrated
Der Aufruf eines öffentlichen Chatraums erfolgt über das Chat Board. Private
Chaträume werden über die Buddy List erzeugt, der eingeladene Benutzer wird
über das Chat Board über die Einladung informiert, von dort aus kann er dann den
Chatraum über einen Link betreten. Sämtliche privaten Chaträume werden in der
Datenbank abgespeichert, und können so lange, bis sie abgelaufen sind (jeder
private Chatraum besitzt ein Attribut expires_at), über den entsprechenden Link
im Chat Board betreten werden.
Abb. 35: Chat Board mit aufgeklapptem Tooltip
Implementierung
•
Kommunikation
Die synchrone Verteilung der Messages erfolgt über Juggernaut. Die Chat
Messages selbst werden über Juggernaut Channels an alle verteilt, die mit dem
entsprechenden Kanal verbunden sind, und die entsprechende View geöffnet
haben.
Die Verwaltung der Kanäle erfolgt über das Modul cmi_juggernaut_connection.
•
Private Chaträume (integrated)
Wird die Variante integrated verwendet, so werden die privaten Chaträume in
einer Tabelle (cmi_private_chat_rooms) abgespeichert, und können über das Chat
Board nach dem Verlassen erneut betreten werden. Die Verwaltung erfolgt
automatisch über das Attribut expires_at, das bei der Erzeugung gesetzt wird.
Abgelaufene Chaträume können nicht mehr betreten werden.
5.2.10
Plug-In cmi_juggernaut_connection
Abhängigkeiten
Das Plug-In cmi_juggernaut_connection besitzt keine Abhängigkeiten zu anderen
Plug-Ins.
2009-09-10
67/107
Details zur Lösung
Beschreibung
Dieses Modul beinhaltet die Komponenten für das Management der JuggernautKanäle. Die Kanäle selbst werden über ihre Namen verwaltet. Kanalnamen sind
beliebige, durch den Anwendungsentwickler definierte Strings.
Generierung und Installation in die Anwendung
Die Komponenten werden von den entsprechenden Modulen automatisch installiert,
es steht kein separater Generator zur Verfügung.
Implementierung
Die Verwaltung der Chat-Kanäle erfolgt über den CmiConnectionsController.
Dieser bietet die Methode get_new_juggernaut_channel(name) an, über die ein
neuer Juggernaut-Kanal, der durch einen Namen identifiziert wird, angefordert
werden kann. Ist der Kanal bereits vorhanden, so wird die Nummer des vorhandenen
Kanals zurückgegeben. Kanalnamen können aus beliebigen Strings bestehen. Da alle
Aufrufe über die Kanalnamen erfolgen, ist gewährleistet, dass keine Unbefugten auf
die Kanäle zugreifen können.
Die Kanäle werden in der Tabelle cmi_connections abgespeichert.
Per default sind die ersten zehn Kanäle für allgemeine Zwecke (wie zum Beispiel für
fix vorgesehene Chat-Kanäle) reserviert. Diese Zahl kann ist als Konstante definiert,
und kann beliebig geändert werden. Alle Kanäle, die über dieser Konstante liegen,
werden dynamisch zugeteilt.
Jeder Zugriff auf einen Kanal aktualisiert das Attribut last_served_at des
entsprechenden Kanals. Dadurch ist es möglich, nicht mehr verwendete Kanäle zu
identifizieren, und aus der Tabelle zu löschen. Der CmiConnectionsController
bietet dazu die Methode clean_up_channels an.
5.2.11
Plug-In cmi_interactive_user_info (Interactive User
Info)
Abhängigkeiten
Das Plug-In cmi_interactive_user_info besitzt direkte Abhängigkeiten zu den Plug-Ins
Tooltips und cmi_user_avatar.
Die optionale Abhängigkeit zu cmi_virtual_me besteht für das Editieren der Daten des
virtual me.
2009-09-10
68/107
Details zur Lösung
Abb. 36: cmi_interactive_user_info Abhängigkeiten
Beschreibung
Über die Interactive User Info wird die Interaktion mit anderen Benutzern
ermöglicht.
Generierung und Installation in die Anwendung
Mit ruby script\generate cmi_interactive_user_info users wird das Modul
installiert. Der Parameter users ist optional und gibt den Namen der User- Tabelle an.
Wird der Parameter angegeben, so wird eine Migration angelegt, die zur User-Tabelle
eine neue Spalte user_avatar hinzufügt. Dies ist jedoch nur als Alternative gedacht,
denn per default wird der User Avatar des separaten Plug-Ins cmi_user_avatar
verwendet, das automatisch mit installiert wird, falls es noch nicht vorhanden ist. Die
Assoziation mit dem User Model (has_one :cmi_user_avatar) muss jedoch ggf.
noch manuell ins User Model eingefügt werden.
Die View _cmi_current_user.html.erb wird in das Verzeichnis app\views\cmi_general
generiert, und realisiert die View für die Interactive User Info.
Als weitere Option steht für die Installation der Parameter --skip-migration zur
Verfügung.
Vor der Verwendung der Interactive User Info ist nach der Installation noch ein rake
db:migrate erforderlich.
Integration in die Anwendung
Zur
Verwendung
der
Interactive
User
Info
kann
das
Partial
_cmi_current_user.html.erb, das in das Verzeichnis app\views\cmi_general installiert
wird, in die gewünschten Views eingebunden werden.
Im tooltip image_tag des Partials können nun Links zu beliebigen Aktionen
erstellt werden.
Beispiel für die Verwendung der View (z.B. in index.html.erb einfügen):
<%= render(:partial => "cmi_general/cmi_current_user.html.erb") %>
Benutzung
Per Mausklick auf das Benutzer-Icon öffnet sich ein Tooltip, von dem aus die
weiteren möglichen Aktionen erreichbar sind.
2009-09-10
69/107
Details zur Lösung
Vordefinierte Aktionen sind:
•
•
Change state
Hier kann der Availability State des Benutzers eingestellt werden.
Edit user data
Ein Formular zum Editieren der Benutzerdaten und der Daten vom Virtual Me
des Users, wird geöffnet. Da diese Einstellungen nur zusammen mit dem Plug-In
cmi_virtual_me sinnvoll sind, wird empfohlen, dieses Plug-In zusammen mit
cmi_interactive_user_info zu installieren.
Implementierung
Sämtliche Aktionen mit dem eigenen Benutzer sind über das User Icon möglich, und
werden über einen Tooltip, der durch das Plug-In Tooltips realisiert ist, in der Datei
_cmi_current_user.html.erb erstellt. Die Aktionen mit anderen Benutzern erfolgt
ähnlich über die Buddy List bzw. über die User Gallery.
5.2.12
Plug-In acts_as_versioned (Immutable Versions,
Activity Log)
Abhängigkeiten
Das Plug-In acts_as_versioned besitzt keine Abhängigkeiten zu anderen Plug-Ins.
Beschreibung
Die Entwicklung eines Artefakts soll in einem Version Tree abgespeichert werden. Zu
diesem Zweck werden alle Versionen eines Artefakts zusammen mit einem
Zeitstempel abgespeichert (Immutable Versions). Bei Bedarf kann auf eine frühere
Version zurückgegriffen werden.
Soll die zeitliche Entwicklung eines Artefakts genau nachvollzogen werden, so kann
das Muster Activity Log implementiert werden. Es muss zusätzlich bei jedem Zugriff
auf das Artefakt, bzw. bei jeder Änderung am Artefakt ein Kommentar zu der
Änderung mit abgespeichert werden.
Generierung und Installation in die Anwendung
Dieses Entwurfsmuster wurde durch das externe Plug-In acts_as_versioned realisiert.
Dessen
Homepage
lässt
sich
im
Web
über
den
Link
http://agilewebdevelopment.com/plugins/acts_as_versioned, bzw. auf GitHub über
http://github.com/technoweenie/acts_as_versioned/tree/master aufrufen.
Anders als auf der Homepage angegeben, wird empfohlen, das Plug-In von GitHub
über den Link http://github.com/technoweenie/acts_as_versioned herunterzuladen,
und in das plugins Verzeichnis des Projekts zu kopieren. In dieser Form ist das Plug-
2009-09-10
70/107
Details zur Lösung
In auch bereits im Repository des Projekts enthalten, es kann somit auch direkt von
dort verwendet werden.
Integration in die Anwendung
Prinzip des Plug-Ins:
•
•
Das Model, das versioniert werden soll, wird in einer zweiten Tabelle gespiegelt,
in dieser zweiten Tabelle werden sämtliche Versionen des Models abgespeichert.
Das entsprechende Model wird nach dem acts_as Prinzip, durch Einfügen von
acts_as_versioned im Model, um alle notwendigen Methoden für den Zugriff
und die Steuerung der Versionen erweitert. Der Zugriff auf die Versionen erfolgt
direkt über die Instanzvariablen.
Beispiel: Das Model Tour soll eine Versionierung erhalten.
•
Erstellen einer mirror table:
Es wird eine neue Migration angelegt, die den Namen TourVersions erhält. Die
Tabelle
selbst
wird
über
Tour.create_versioned_table
erzeugt,
Fremdschlüssel ist die tour_id von Tour.
class CreateToursVersions < ActiveRecord::Migration
def self.up
Tour.create_versioned_table do |t|
t.column :version, :integer
t.column :tour_id, :integer
t.string :title
end
end
def self.down
Tour.drop_versioned_table
end
end
•
Zugriff auf die Daten
Im Model Tour wird die Zeile acts_as_versioned eingefügt.
Über @tour.versions kann nun auf alle Versionen von @tour zugegriffen
werden.
Ein gutes Tutorial zur Verwendung des Plug-Ins befindet sich auf
http://www.urbanhonking.com/ideasfordozens/archives/2006/02/learns_to_use_a_1.ht
ml, allerdings bezieht es sich nicht auf die aktuelle Version des Plug-Ins.
2009-09-10
71/107
Details zur Lösung
5.2.13
Plug-In cmi_coll_session (Collaborative Session, User
List)
Abhängigkeiten
Das Plug-In cmi_coll_session besitzt für den synchronen Update der View eine
optionale Abhängigkeit zu Juggernaut.
Abb. 37: cmi_coll_session Abhängigkeiten
Beschreibung
Der Kontext einer kollaborativen Sitzung (Collaborative Session) wird als Session
Objekt modelliert, welches den Session State visualisiert, und die Benutzer bei der
Session unterstützt.
Dazu wird ein Objekt der Klasse CmiCollSession erzeugt, welches mit dem Model,
in dem die Session stattfindet, assoziiert ist. Die Verwaltung des Session Objekts
erfolgt über das assoziierte Objekt.
Generierung und Installation in die Anwendung
Das Modul wird über den Befehl ruby script\generate cmi_coll_session
session_table generiert, und in die Anwendung installiert, wobei der Parameter
session_table den Namen der Tabelle angibt, in dessen Model die Session
stattfindet.
Folgende Parameter können ebenfalls bei der Generierung mit angegeben werden:
--without-juggernaut: Überspringt den Check, ob Juggernaut installiert ist.
--install-juggernaut: Führt das Install-Script (install.rb) von Juggernaut aus.
--skip-migration: Die Migration wird nicht angelegt.
Anwendungsbeispiel: Die Session findet in CmiRoom statt, dann wird der Generator
wie folgt aufgerufen: ruby script\generate cmi_coll_session cmi_rooms.
Nach der Ausführung der Migration muss das entsprechende Model (z.B. CmiRoom)
mit dem CmiCollSession Model assoziiert werden. Dies wird durch Einfügen
folgender Zeile z.B. im CmiRoom Model erreicht:
has_and_belongs_to_many :cmi_coll_sessions
Integration in die Anwendung
Folgende Schritte sind für die Verwaltung und Aktualisierung der Collaborative
Session erforderlich:
2009-09-10
72/107
Details zur Lösung
•
Session betreten
Eine Session kann über die Methode enter_coll_session(object, user)
betreten werden. Existiert die Session noch nicht, so wird sie erzeugt.
Beispiel: In cmi_room wird enter_coll_session jedesmal beim Betreten des
Raums, in der Methode cmi_a_room vom CmiRoomController, aufgerufen:
CmiCollSession.enter_coll_session(@room, @user)
•
Benutzerstatus setzen
Das Ändern des Benutzerstatus erfolgt ähnlich wie das Initialisieren, ein Beispiel
dafür ist im ToursController in der Methode new_tour_room implementiert.
Der Benutzerstatus der Session wird automatisch auf den Standardwert
zurückgesetzt, wenn innerhalb einer im Model definierbaren Zeitspanne keine
Benutzeraktion stattfindet.
•
Session State View bei allen Clients aktualisieren
Ist das Juggernaut Plug-In installiert, so wird bei jeder Status-Änderung, der
Session State View automatisch synchron bei allen Clients aktualisiert (User
List).
Wie dies umgesetzt werden kann, ist im CmiRoomsController in der Methode
update_immediate_cmi_session gezeigt.
Die Session State View kann durch folgenden Aufruf in die Anwendung eingebunden
werden:
<%= render(:partial => "cmi_coll_session/cmi_coll_session_state.html.erb",
:locals => {:room => @room}) %>
Benutzung
Die Session State View zeigt die aktuelle Aktivität der Benutzer an, sie unterstützt
somit die Spontaneous Collaboration mit anderen Benutzern:
Abb. 38: Session State View
Implementierung
Schon beim Generieren des Plug-Ins wird angegeben, in welchem Model die
Collaborative Session stattfinden wird, das heißt, mit welchem Model die Session in
Beziehung steht (in diesem Beispiel ist es CmiRoom).
Das CmiCollSession Model ist so allgemein gehalten, dass es in jedem beliebigen
Container verwendet werden kann, lediglich für das Initialisieren des Objekts müssen
2009-09-10
73/107
Details zur Lösung
ggf.
Anpassungen
vorgenommen werden (siehe dazu z.B. die Methode
enter_coll_session in der Klasse CmiCollSession).
CmiCollSession und das Container Model stehen in einer n:m Beziehung
zueinander, die Assoziation erfolgt über die cmi_coll_sessions_... Join Table.
Der Session State der Benutzer kann, so wie oben beschrieben wurde, eingestellt
werden. Wie die Clients über Juggernaut aktualisiert werden, ist in der Methode
update_immediate_cmi_session im CmiRoomsController gezeigt.
Für das Entfernen von verwaisten Sessions steht die Methode maintain_all in der
Klasse CmiCollSession zur Verfügung. Wird diese Methode aufgerufen, dann wird
der Benutzerstatus aller Benutzer aktualisiert, und nach Ablauf einer definierten
Zeitspanne ohne Benutzeraktion, wird der entsprechende Status auf den Standardwert
zurückgesetzt.
5.2.14
Plug-In cmi_remote_subscription (Remote
Subscription)
Abhängigkeiten
Das Plug-In cmi_remote_subscription besitzt eine direkte Abhängigkeit zum Plug-In
cmi_message.
Abb. 39: cmi_remote_subscription Abhängigkeiten
Beschreibung
Das Plug-In cmi_remote_subscription ermöglicht es den Benutzern, sich bei einem
Model zu registrieren, um per Email eine Nachricht zu erhalten, wenn eine Änderung
an einem entsprechenden Model durchgeführt wurde.
Soll die Benachrichtigung direkt an den Client weitergereicht werden, muss auf
Juggernaut zurückgegriffen werden.
Generierung und Installation in die Anwendung
Das Modul wird mittels ruby script\generate cmi_remote_subscription
installiert, folgende Parameter können beim generieren angegeben werden:
--skip-migration: Die Migration wird nicht angelegt.
2009-09-10
74/107
Details zur Lösung
--skip-cmi-messages: Die Installation überspringt den Check, ob das Plug-In
cmi_message bereits in die Anwendung installiert wurde.
--skip-environment: Der CmiRemoteSubsciptionObserver wird nicht in der Datei
environment.rb registriert.
Nach Ausführung der Migration durch rake db:migrate muss nun noch die
Beziehung zum User Model, durch einfügen der Zeile has_many
:cmi_remote_subscriptions in das User Model, definiert werden.
Integration in die Anwendung
Nachdem die Installation durchgeführt wurde, muss ggf. noch der ActionMailer
eingerichtet werden, dann ist cmi_remote_subscription einsatzbereit.
Damit die Benutzer Mitteilungen über die Änderungen an den registrierten Objekten
erhalten, muss das entsprechende Model im CmiRemoteSubscriptionObserver, der
sich im models Verzeichnis befindet, registriert werden.
Dies geschieht z.B. für CmiRoom durch Einfügen der Zeile observe CmiRoom im
Observer.
Benutzung
•
Remote Subscriptions einrichten
Über den Link /cmi_remote_subscriptions gelangt der Benutzer auf die
Konfigurationsseite, auf der er sich für Änderungen an bestimmten Models
registrieren kann.
Abb. 40: Erstellen einer Remote Subscription
•
Empfangen der Nachrichten
Jedes Mal, wenn ein registriertes Model geändert wird, wird im Observer die
entsprechende Methode aufgerufen. Darin wird überprüft, welche Benutzer sich
für diese Änderung registriert haben. Diesen Benutzern wird dann die passende
Nachricht zugeschickt, gleichzeitig wird die Nachricht auch in Form eines
CmiMessage Objekts in der Datenbank abgespeichert, wo sie somit auch über das
Message Board (siehe cmi_message) zugänglich ist.
2009-09-10
75/107
Details zur Lösung
Implementierung
Über die Datei environment.rb wird der CmiRemoteSubscriptionObserver in der
Anwendung als Observer registriert.
Der aktuelle Benutzer (current_user) wird dem Observer über den CmiHelper zur
Verfügung gestellt, dieser wiederum wird über einen before_filter in der Datei
application.rb aktualisiert.
Das Versenden der Nachrichten erfolgt über den ActionMailer.
5.2.15
Plug-In Juggernaut (Mediated Updates)
Abhängigkeiten
Das Plug-In Juggernaut besitzt keine direkten Abhängigkeiten zu anderen Plug-Ins.
Beschreibung
Wie bereits in Abschnitt 3.1.1 beschrieben wurde, basiert Juggernaut auf Flash und
ermöglicht es dem Server, Daten aktiv an die Clients zu verteilen. Deshalb wurde
Juggernaut für die Realisierung des Entwurfsmusters Mediated Updates ausgewählt.
Die Projektseite von Juggernaut ist unter http://juggernaut.rubyforge.org/ zu finden,
eine aktive Google Group befindet auf http://groups.google.com/group/Juggernautfor-Rails.
Generierung und Installation in die Anwendung
Eine Anleitung zur Installation von Juggernaut befindet sich im Anhang.
Die Konfigurierung von Juggernaut erfolgt durch ein eigenes Konfigurationsfile, das
sich im Wurzelverzeichnis der Anwendung befindet, und den Namen juggernaut.yml
trägt.
Integration in die Anwendung
Das Senden der Nachrichten an die entsprechenden Clients kann in Juggernaut wie in
folgendem Beispiel gezeigt, erfolgen (siehe z.B. distribute_immediate_message
(receiver) der Klasse CmiBuddyListsController).
2009-09-10
76/107
Details zur Lösung
begin
#send to Juggernaut clients...
render :juggernaut => {:type => :send_to_clients, :client_ids =>
[receiver.id.to_i.to_i]} do |page|
#the div with the id "msg_board_messages" will be replaced
page.replace_html "msg_board_messages", :partial =>
'/cmi_messages/cmi_new_message.html.erb',
:locals => {:user => receiver}
end
end
Die View kann folgendermaßen implementiert werden:
<%= javascript_include_tag :defaults, :juggernaut %> <!-- include Juggernaut -->
<%= juggernaut :client_id => current_user[:id] %>
<!-- the Juggernaut client id -->
<h3>Message board:</h3>
<div id="msg_board_messages" style="list-style:none"> </ul>
<%= render :partial => "/cmi_messages/cmi_messages.html.erb", :locals => {:user
=> current_user} %>
<!-- this div will be replaced -->
</div>
Tutorials:
Ein gutes Tutorial, um eine Chat-Anwendung zu erstellen, befindet sich hier:
http://www.dorkalev.com/2008/04/juggernaut-up-to-date-tutorial-1042008.html
Wie die Juggernaut-eigene Users List abgefragt, und in das eigene Programm
eingebunden werden kann, wird unter folgendem Link beschrieben:
http://slightlycoded.com/blog/juggernaut-part-2-connected-users-list
5.3 Weitere Plug-Ins
Im Folgenden werden Plug-Ins beschrieben, die nicht direkt Entwurfsmuster
implementieren, die aber für die Umsetzung der Entwurfsmuster benötigt werden.
5.3.1 Plug-In cmi_user_avatar
Abhängigkeiten
Das Plug-In cmi_user_avatar besitzt eine direkte Abhängigkeit zum externen Plug-In
Attachment Fu.
Abb. 41: cmi_user_avatar Abhängigkeiten
2009-09-10
77/107
Details zur Lösung
Beschreibung
Dieses Plug-In stellt die Komponenten bereit, die in diesem Projekt für einen User
Avatar benötigt werden.
Da der User Avatar von mehreren Plug-Ins, die unabhängig voneinander installiert
werden können, verwendet wird, wurde er in ein separates Modul ausgelagert.
Generierung und Installation in die Anwendung
Die Installation dieses Plug-Ins wird im Normalfall automatisch von den Plug-Ins, die
es verwenden 46, durchgeführt, deshalb ist eine separate Installation üblicherweise
nicht erforderlich.
Soll das Plug-In jedoch trotzdem eigenständig installiert werden, kann dies über den
Befehl ruby script\generate cmi_user_avatar erreicht werden, optional kann
als Parameter --skip-migration angegeben werden.
Da der User Avatar in einer 1:1 Beziehung mit dem User steht, muss nach der
Migration noch folgende Zeile im User Model eingefügt werden:
has_one :cmi_user_avatar
Integration in die Anwendung, Benutzung
Es sind keine zusätzlichen Schritte notwendig, die Verwendung der Komponenten des
Plug-Ins ist bereits in den entsprechenden, übergeordneten Plug-Ins, integriert.
Implementierung
Das Pllug-In basiert auf dem externen Plug-In Attachment Fu. Die Verwendung des
User Avatars kann eingeteilt werden in:
• Einen neuen User Avatar erstellen
Über die View cmi_virtual_me_edit.html.erb 47 kann ein User Avatar ausgewählt,
und auf den Server hochgeladen werden. Attachment Fu generiert aus dem
gewählten Bild nun zwei neue Bilder, das Standard-Bild und das Thumbnail, lädt
beide auf den Server, und generiert die Einträge in der entsprechenden Tabelle.
Die Parameter für die Bilder können im Model definiert werden.
• Den User Avatar verwenden
Beispiel: the_user ist eine Instanz des, um die Methoden von Attachment Fu
erweiterten Models, User.
Beide Bilder können nun nach Wunsch wie folgt in der Anwendung eingesetzt
werden:
the_user.cmi_user_avatar.public_filename
the_user.cmi_user_avatar.public_filename(:thumb)
46
47
Dies sind: cmi_virtual_me, cmi_user_gallery, cmi_buddy_list und cmi_interactive_user_info.
Wird durch das Plug-In cmi_virtual_me installiert.
2009-09-10
78/107
Details zur Lösung
5.3.2 Plug-In demo_bike_guide
Abhängigkeiten
Das Plug-In demo_bike_guide besitzt keine direkten Abhängigkeiten.
Beschreibung
Dieses Modul dient zur Demonstration der Anwendung, insbesondere für das Plug-In
cmi_room. Es wird gezeigt, wie das Demo-Modul in die Anwendung bzw. in einen
Raum eingebunden werden kann.
Bike Guide dient zur Verwaltung von Mountainbike-Routen. Es können Routen
erstellt werden, diese können dann zu Räumen hinzugefügt werden.
Jedem Raum können beliebige Routen zugeordnet werden.
Hinweis: demo_bike_guide dient nur zu Demonstrationszwecken, es wurden hier
keine besonderen Maßnahmen bezüglich Sicherheit und Erweiterbarkeit getroffen.
Generierung und Installation in die Anwendung
Die Installation des Moduls erfolgt über den Befehl ruby script\generate
demo_bike_guide, wobei der Parameter --skip-migraion optional angegeben
werden kann, wenn keine Migrationsdateien angelegt werden sollen.
Soll das Modul zusammen mit einer anderen Anwendung, als dem Basisprojekt,
verwendet werden, so müssen in der Datei routes.rb noch die zusätzlichen Routes
eingetragen werden:
map.resources :tours
map.show_tour_room '/show_tour_room/:id', :controller => 'tours', :action =>
'show_tour_room'
map.new_tour_room '/new_tour_room', :controller => 'tours', :action => 'new_tour_room'
map.add_tour_room '/add_tour_room', :controller => 'tours', :action => 'add_tour_room'
map.remove_tour_room '/remove_tour_room', :controller => 'tours', :action =>
'remove_tour_room'
Integration in die Anwendung
Vor der Verwendung muss das CmiRoom Model noch mit dem Tour Model in
Beziehung gesetzt werden, das erfolgt durch das Einfügen der Zeile
has_and_belongs_to_many :tours in der Datei cmi_room.rb.
Bike-Guide kann wie folgt in einen Room, z.B. in der View cmi_a_room.html.erb,
eingebunden werden:
<%= render :file => "/tours/index_room.html.erb",
:params => {:layout => true} %>
2009-09-10
79/107
Details zur Lösung
Benutzung
Die Verwaltung der Touren selbst erfolgt über den Link /tours.
Befindet man sich in einem Raum, so können beliebige Touren zu diesem Raum
hinzugefügt, bzw. auch wieder entfernt werden.
Realisierung
CmiRoom und Tour stehen in einer n:m Beziehung zueinander, und werden über die
Join Tabelle cmi_rooms_tours miteinander verknüpft.
Als Erweiterung wäre z.B. vorstellbar, eine weitere Tabelle einzuführen, in der
zusätzliche Daten zu den Routen (wie zum Beispiel Rundenzeiten einzelner Benutzer
oder Kommentare und Diskussionsbeiträge einzelner Benutzer) verwaltet werden
könnten. Das führt jedoch über das Ziel dieser Arbeit hinaus, und deshalb wurde
darauf verzichtet.
5.3.3 Plug-In Restful Authentication
Abhängigkeiten
Das Plug-In Restful Authentication besitzt eine direkte Abhängigkeit zu
acts_as_state_machine.
Abb. 42: Restful Authentication Abhängigkeiten
Beschreibung
Restful Authentication stellt die Funktionalität für die Benutzerverwaltung und
Authentisierung zur Verfügung. Folgende Funktionen werden abgedeckt 48:
• Login / Logout
• Sichere Passwortverwaltung
• Account-Aktivierung per Email
• Freigabe des Accounts durch den Administrator
• Methoden für die Autorisierung und Zugriffskontrolle
Die Homepage von Restful Authentication lässt sich über den
http://agilewebdevelopment.com/plugins/restful_authentication aufrufen.
48
Link
Quelle: http://wiki.github.com/technoweenie/restful-authentication
2009-09-10
80/107
Details zur Lösung
Installation
Das Plug-In ist bereits im Repository dieser Arbeit enthalten, und kann so direkt ohne
weitere Installation verwendet werden. Alternativ dazu kann das Plug-In mittels ruby
script\plugin install http://svn.techno-weenie.net/projects/plugins/
restful_authentication/ installiert werden.
5.3.4 Plug-In acts_as_state_machine
Abhängigkeiten
Das Plug-In acts_as_state_machine besitzt keine direkten Abhängigkeiten zu anderen
Plug-Ins.
Beschreibung
Mittels dieses Plug-Ins kann ein Model um Funktionalitäten einer State Machine
erweitert werden. Die Homepage des Plug-Ins lässt sich über folgenden Link
aufrufen: http://agilewebdevelopment.com/plugins/acts_as_state_machine
Installation
Das Plug-In wird über ruby script\plugin install http://elitists
textdriven.com/svn/plugins/acts_as_state_machine/trunk installiert. Da das
originale Plug-In um zwei Class Methods erweitert wurde, die für das Plug-In
cmi_virtual_me erforderlich sind, wird empfohlen, das Plug-In direkt aus dem
Repository zu verwenden. Alternativ dazu können die beiden Methoden auch manuell
in das Plug-In eingefügt werden.
Integration in die Anwendung
Folgendes Beispiel stammt von der Homepage von acts_as_state_machine. Es wird
gezeigt, wie das Model Nonprofit um folgende State Machine erweitert wird, und
wie eine State Machine definiert, und verwendet werden kann:
2009-09-10
81/107
Details zur Lösung
Abb. 43: acts_as_state_machine Nonprofit (Quelle:
http://www.ibm.com/developerworks/java/library/j-cb03137/figure1.gif )
•
Model erweitern und Zustände definieren:
class Nonprofit < ActiveRecord::Base
acts_as_state_machine :initial => :created, :column => 'status'
# These are all of the states for the existing system.
state :submitted
state :processing
state :nonprofit_reviewing
state :accepted
•
Eventhandler definieren, die die Zustandsübergänge auslösen
event :accept do
transitions :from => :processing, :to => :accepted
transitions :from => :nonprofit_reviewing, :to => :accepted
end
event :receive do
transitions :from => :submitted, :to => :processing
end
# either a CTP or nonprofit user edits the entry, requiring a review
event :send_for_review do
transitions :from => :processing, :to => :nonprofit_reviewing
transitions :from => :nonprofit_reviewing, :to => :processing
transitions :from => :accepted, :to => :nonprofit_reviewing
end
end
•
Die Zustandsübergänge können nun z.B. wie folgt aufgerufen werden, wenn
nonprofit eine Instanzvariable von Nonprofit ist:
nonprofit.accept!
Implementierung
Das Plug-In wurde wie folgt erweitert:
•
Die Methode all_possible_events gibt ein Array zurück, das alle
Zustandsübergänge enthält.
2009-09-10
82/107
Details zur Lösung
def all_possible_events
returning Array.new do |events|
self.class.read_inheritable_attribute
(:transition_table).each_pair do |event, value|
events << event
if value.detect{|transition|
transition.from == current_state }
end
end
end
end
•
Die Methode possible_events_from_state gibt ein Array zurück, das alle
Zustandsübergänge enthält, die von dem als Parameter übergebenen Zustand aus
möglich sind.
def possible_events_from_state(from_state)
to_arr = Array.new
transitions = self.class.read_inheritable_attribute
(:transition_table)
transitions.each_pair do |event, value|
value.each do |trans_state|
if trans_state.from.to_s == from_state.to_s
to_arr.push(trans_state.to)
end
end
end
return to_arr
end
5.3.5 Plug-In Rails Widgets (Tooltips)
Abhängigkeiten
Das Plug-In Rails Widgets besitzt keine direkten Abhängigkeiten.
Beschreibung
Tooltips ist ein Bestandteil des Plug-Ins Rails Widgets, dessen Homepage über den
Link http://wiki.github.com/paolodona/rails-widgets/tooltips aufgerufen werden kann.
Tooltips bietet die Möglichkeit, User Interface Elemente um einen Tooltip zu
erweitern, dieses Plug-In wird in mehreren CMI-Plug-Ins verwendet.
Installation
Eine Installationsanleitung ist auf der Homepage zu finden. Das Plug-In kann auch
direkt aus dem Projekt-Repository verwendet werden, dann erfolgt die Installation
durch Aufruf von rake widgets:setup.
2009-09-10
83/107
Details zur Lösung
5.4 Eine Anwendung erstellen
In diesem Abschnitt wird erläutert, wie mittels einiger der vorgestellten Plug-Ins
zusammen mit der Basisanwendung in sieben Schritten eine kollaborative
Anwendung erstellt werden kann.
Jeder dieser Schritte wird mit einer Aufgabenstellung 49 eingeleitet. Danach folgt ein
Beispiel, wie diese Aufgabenstellung in CURE implementiert wurde. Im Anschluss
daran wird gezeigt, wie die Aufgabenstellung mit den jeweiligen Plug-Ins umgesetzt
werden kann. Zur Verdeutlichung wird jeweils am Ende des Schritts ein Diagramm
dargestellt, das die Modelle der Plug-Ins der aktuellen Konfiguration, und deren
Beziehungen zueinander, abbildet. Die neu hinzugefügten Modelle sind jeweils rot
eingefärbt.
Schritt 1: Login
Aufgabenstellung
Verbindet sich der Benutzer mit dem Server, soll ein Login Screen erscheinen, der
dem Benutzer die Möglichkeit bietet, einen neuen Account anzulegen, bzw. sich
einzuloggen, wenn der Benutzer bereits einen gültigen Account besitzt.
Beispiel CURE
Folgende Abbildung zeigt den Login Screen von CURE mit dem Bereich für den
Login, dem Link zur Beantragung eines neuen Zugangs, und einem Ausschnitt aus
dem Formular zur Beantragung eines Zugangs zu CURE.
Abb. 44: Login Screen von CURE und Zugang zu CURE beantragen
49
Die Aufgabenstellungen sind größtenteils an Abschnitte aus (Schümmer 2006) angelehnt.
2009-09-10
84/107
Details zur Lösung
Vergleich: Cooperation/CMI
Als Vergleich zu CURE, nun eine Abbildung des Login Screens des Basisprojekts:
Abb. 45: Login Screen und Signup (Zugang beantragen) von Cooperation
Umsetzung
Die Benutzerverwaltung inklusive Login ist bereits im Basisprojekt enthalten. Zur
Verwendung wird das Basisprojekt aus dem Repository ausgecheckt, und die
Migration durchgeführt. Nach den Starten des Servers ist der Login Screen über den
Link hostname:port erreichbar.
Generierte Modelle
Folgende Abbildung zeigt alle bisher generierten Modelle, und deren Beziehungen
zueinander:
Abb. 46: Schritt 1: Modelle und Beziehungen
Siehe auch:
Basisprojekt, Abschnitt 5.2.1
Schritt 2: Introduce Yourself
Aufgabenstellung
Der Benutzer möchte sein eigenes Benutzerprofil, sein Virtual Me, anlegen. Dieses
beinhaltet eine nähere Beschreibung des Benutzers und dessen Bild.
2009-09-10
85/107
Details zur Lösung
Beispiel CURE
Der Aufruf des Benutzerprofils erfolgt über das User Icon, wobei zwischen
Benutzerprofil zeigen und Benutzerprofil editieren gewählt werden kann.
Abb. 47: Benutzerprofil editieren in CURE
Vergleich: Cooperation/CMI
Das Editieren des eigenen Benutzerprofils erfolgt, wie die anderen Aktionen, die mit
dem eigenen Benutzer möglich sind, hier ebenfalls über das User Icon.
Oberhalb des User Icons wird zusätzlich der Availability Status des Benutzers
angezeigt.
Abb. 48: CMI Plug-In Virtual Me mit aufgeklapptem Tooltip
2009-09-10
86/107
Details zur Lösung
Umsetzung
Das Entwurfsmuster Virtual Me wird durch das Modul cmi_virtual_me umgesetzt.
Nachdem alle Abhängigkeiten von cmi_virtual_me installiert wurden (im Normalfall
fehlt an dieser Stelle nur noch Attachment Fu), wird das Plug-In mittels ruby
script\generate cmi_virtual_me in die Anwendung installiert. Im Anschluss
daran können bei Bedarf noch die Attribute in der Migrationsdatei
(cmi_create_virtual_mes.rb) angepasst werden, bevor die Migrationen durchgeführt
werden. Danach müssen im User Model noch die Zeile has_one :cmi_user_avatar
für die Assoziierung mit dem User Avatar, und die Zeile acts_as_virtual_me für
die Erweiterung des Users durch acts_as_virtual_me, eingefügt werden..
Das virtual me ist jetzt bereits vollständig, und könnte schon in der Anwendung
verwendet werden.
Benutzerfreundlicher ist die Verwendung jedoch über die Interactive User Info,
deshalb wird ein weiteres Plug-In durch Aufruf der Befehle ruby script\generate
50
cmi_interactive_user_info , und rake db:migrate, in die Anwendung
installiert.
Nun kann das Partial _cmi_current_user.html.erb, das in das Verzeichnis
app\views\cmi_general installiert wurde, an der gewünschten Stelle (z.B. im Layout
des Cooperation-Projekts in der Sektion <div id="side">) eingebunden werden,
und ist vollständig verwendbar.
Generierte Modelle
Folgende Abbildung zeigt alle bisher generierten Modelle, und deren Beziehungen
zueinander:
Abb. 49: Schritt 2: Modelle und Beziehungen
Siehe auch:
cmi_interactive_user_info, Abschnitt 5.2.11
cmi_virtual_me, Abschnitt 5.2.2.1
cmi_user_avatar, Abschnitt 5.3.1
Attachment Fu, Abschnitt 5.2.6
Tooltips, Abschnitt 5.3.5
50
Die Abhängigkeit zum Plug-In Tooltips sollte zusätzlich berücksichtigt werden.
2009-09-10
87/107
Details zur Lösung
Schritt 3: Andere Benutzer
Aufgabenstellung
Alle Benutzer des Systems 51 sollen angezeigt werden (User Gallery), und je nach
Kontext sollen zusätzlich noch alle Bekannten des Benutzers (Buddies), bzw. alle
Benutzer eines Raums, angezeigt werden (Buddy List).
Beispiel CURE
Die Buddy-Liste in CURE befindet sich auf der Startseite eines Raumes (Hall), und
zeigt alle Buddies des eingeloggten Benutzers an. Die Aktionen Add personal Buddy,
show profile und Mail mit den Benutzern können aufgerufen werden.
Abb. 50: Buddy-Liste in CURE
Vergleich: Cooperation/CMI
CMI stellt dafür die Module cmi_buddy_list und cmi_user_gallery bereit, die an einer
beliebigen Stelle in die Anwendung eingebunden werden können.
Aus Benutzersicht unterscheiden sich die beiden Listen hauptsächlich dadurch, dass
die Buddies durch den Benutzer selbst in die Buddy List hinzugefügt bzw. entfernt
werden können, dass die Buddy List auch den Availability Status der Benutzer
anzeigt, und dass in den beiden Listen unterschiedliche Aktionen mit den Benutzern
möglich sind.
Die Benutzeraktionen erfolgen jeweils über den Tooltip des User Icons.
Abb. 51: CMI Buddy List
51
Je nach Bedarf kann es erforderlich sein, dass nicht alle Benutzer, sondern nur bestimmte Benutzer
angezeigt werden.
2009-09-10
88/107
Details zur Lösung
Umsetzung
•
User Gallery
Das Plug-In wird über den Befehl ruby script\generate cmi_user_gallery
in die Anwendung installiert. Zur Anzeige der User Gallery muss das Partial
_cmi_user_gallery.html.erb an einer beliebigen Stelle (z.B. im Projekt
Cooperation in der Datei index.html.erb) durch Einfügen folgenden Codes
eingebunden werden:
<%= render(:partial => "cmi_general/cmi_user_gallery.html.erb",
:locals => {:ext_links =>
"/cmi_general/cmi_user_gallery_create_buddy_links.html.erb"}) %>
•
Buddy List
Bevor das Plug-In installiert werden kann, muss das Plug-In cmi_message
installiert werden, dies erfolgt durch ruby script\generate cmi_message. Die
Installation der Buddy List selbst erfolgt durch Aufruf von ruby
script\generate cmi_buddy_list. Das Assoziieren der beiden Models
(CmiMessage und CmiBuddyList) mit dem User Model durch Einfügen der Zeilen
has_many :cmi_buddy_lists und has_many :cmi_messages im User Model,
und die Ausführung der Migrationen, schließen die Installation ab.
Das Partial _cmi_buddy_list.html.erb kann nun wie folgt, z.B. in der Layout Datei
cooperation.html.erb, eingefügt werden:
<% the_user_ids =CmiHelper.get_buddy_ids_by_conditions
(current_user, "state == 'confirmed'")%>
<%= render(:partial => "cmi_buddy_list/cmi_buddy_list.html.erb",
:locals => {:ext_links =>
"/cmi_buddy_list/cmi_buddy_list_default_links.html.erb",
:the_user_ids => the_user_ids}) %>
Generierte Modelle
Folgende Abbildung zeigt alle bisher generierten Modelle, und deren Beziehungen
zueinander:
Abb. 52: Schritt 3: Modelle und Beziehungen
Siehe auch:
cmi_user_gallery, Abschnitt 5.2.3
cmi_buddy_list, Abschnitt 5.2.4
cmi_message, Abschnitt 5.2.8
2009-09-10
89/107
Details zur Lösung
Schritt 4: Räume für die Zusammenarbeit erstellen und verwalten
Aufgabenstellung
Die Zusammenarbeit soll in Räumen erfolgen. Räume sollen erstellt und verwaltet
werden können, die Inhalte und Ergebnisse der Zusammenarbeit sollen in Räumen
abgespeichert werden.
Beispiel CURE
In CURE werden virtuelle Räume als Ort für die Zusammenarbeit genutzt. Die Inhalte
von Räumen werden als Seiten bezeichnet, ein Raum kann viele Seiten (Pages)
beinhalten 52.
Abb. 53 zeigt einen Raum (1.) und eine sich darin befindende Seite (2.).
Abb. 53: Raum und Seite in CURE
Vergleich: Cooperation/CMI
Cooperation organisiert Zusammenarbeit ebenfalls durch virtuelle Räume. Von einem
Startpunkt aus gelangt der Benutzer zu den verschiedenen Räumen. Von dort aus
können die Räume betreten werden. Die Verwaltung der Räume erfolgt über den Link
manage rooms. Über diesen Link kann der Benutzer neue Räume erstellen, und der
jeweilige Besitzer kann seine eigenen Räume editieren.
Räume können beliebige Inhalte besitzen, ein Beispiel dazu wird im Schritt 5 gezeigt.
52
siehe (Schümmer 2006, S. 8)
2009-09-10
90/107
Details zur Lösung
Abb. 54: CMI Room
Umsetzung
Das Plug-In wird über den Aufruf von ruby script\generate cmi_room users in
die Anwendung installiert. Nach der Ausführung der Migration muss das User Model
noch mit dem Model CmiRoom assoziiert werden, das erfolgt durch das Einfügen von
has_and_belongs_to_many :cmi_rooms im User Model.
Die View cmi_room.html.erb dient als Startpunkt für alle weiteren Views, und kann
wie folgt (z.B. direkt in main/index.html.erb) in die Anwendung eingebunden werden:
<%= render(:partial => "cmi_rooms/cmi_room.html.erb") %>
Von dieser View aus sind alle weiteren Optionen erreichbar.
Generierte Modelle
Folgende Abbildung zeigt alle bisher generierten Modelle, und deren Beziehungen
zueinander:
Abb. 55: Schritt 4: Modelle und Beziehungen
2009-09-10
91/107
Details zur Lösung
Siehe auch:
cmi_room, Abschnitt 5.2.7
cmi_buddy_list, Abschnitt 5.2.4
cmi_message, Abschnitt 5.2.8
Schritt 5: Inhalte von Räumen
Aufgabenstellung
In Räumen sollen Inhalte, wie das Ergebnis von Zusammenarbeit, abgespeichert
werden können.
Beispiel CURE
In CURE werden die Inhalte von Räumen als Seiten bezeichnet. Seiten können aus
strukturiertem Text (durch Verwendung einer Art von Wiki Syntax), oder aus binären
Inhalten bestehen 53. Seiten können miteinander verlinkt werden.
Abb. 56: Seite in CURE im Edit Mode
Vergleich: Cooperation/CMI
Räume können beliebige Inhalte haben. Es wird empfohlen, die Inhalte über ein
separates Model, das über eine Tabelle mit den Räumen verknüpft ist, auszuführen
(siehe folgendes Beispiel für die Umsetzung).
53
Siehe (Haake et al. 2004, S. 4) und (Schümmer 2006).
2009-09-10
92/107
Details zur Lösung
Abb. 57: CMI Room mit Inhalt
Umsetzung
Anhand des Beispiels demo_bike_guide wird nun gezeigt, wie Inhalte in einen Raum
eingefügt werden können.
Die Installation des Beispielmoduls erfolgt über den Befehl ruby script\generate
demo_bike_guide, mit anschließendem rake db:migrate.
Vor der Verwendung muss das CmiRoom Model noch mit dem Tour Model in
Beziehung gesetzt werden, das erfolgt durch Einfügen der Zeile
has_and_belongs_to_many :tours in der Datei cmi_room.rb.
Das Beispiel kann wie folgt in einen Room (am besten in die Datei
cmi_a_room.html.erb) eingebunden werden:
<%= render :file => "/tours/index_room.html.erb",
:params => {:layout => true} %>
2009-09-10
93/107
Details zur Lösung
Generierte Modelle
Folgende Abbildung zeigt alle bisher generierten Modelle, und deren Beziehungen
zueinander:
Abb. 58: Schritt 5: Modelle und Beziehungen
Siehe auch:
demo_bike_guide, Abschnitt 5.3.2
cmi_room, Abschnitt 5.2.7
Schritt 6: Kommunikation mit anderen Benutzern
Aufgabenstellung
Die Anwendung soll den Benutzern je nach Situation das passende Kommunikationsmedium bereitstellen.
Beispiel CURE
In CURE erfolgt die Kommunikation über die Mailing List 54, das ist eine Mailbox, die
sich in einem Raum befindet, und die Nachrichten in Threads geordnet darstellt. Alle
Nachrichten werden auch zusätzlich über Email verschickt (wenn konfiguriert). Auch
ein Embedded Chat Modul ist vorhanden.
54
Siehe (Schümmer 2006, S. 18)
2009-09-10
94/107
Details zur Lösung
Abb. 59: Mailing List in CURE
Vergleich: Cooperation/CMI
Grundsätzlich müssen die Nachrichten unterteilt werden in automatisch generierte
Nachrichten (die vom Benutzer zusätzlich mit einem Mitteilungstext versehen werden
können), und vom Benutzer generierte Nachrichten, wie Emails und ChatNachrichten.
Alle Nachrichten (Emails, Buddy Requests, ...), außer Chat-Nachrichten, werden in
einer Tabelle abgespeichert, und können über das Message Board, das zusammen mit
dem Plug-In cmi_message installiert wird, abgerufen werden. Nachrichten sind den
Benutzern zugeordnet, sie können über Email und/oder Juggernaut an die Empfänger
verteilt werden.
Beim Chat wird zwischen privaten und öffentlichen Chaträumen unterschieden. Der
Aufruf der Chaträume kann wahlweise entweder unabhängig von der Anwendung,
oder integriert in die Anwendung, erfolgen.
Abb. 60: CMI Message Board
2009-09-10
95/107
Details zur Lösung
Umsetzung
•
Automatisch generierte Nachrichten und Emails
Die Infrastruktur für die Verteilung und Betrachtung von Emails und automatisch
generierten Nachrichten wird durch das Modul cmi_message bereitgestellt, das
bereits installiert wurde.
Das Versenden der Nachrichten erfolgt entweder nach einer Benutzeraktion (wie
z.B. einer Buddy Anfrage), oder über die Interactive User Info (Email).
Diese Nachrichten können über das Message Board betrachtet werden.
Das Message Board kann in eine View eingebunden werden, indem das Partial
cmi_message_board.html.erb an der gewünschten Stelle wie folgt in eine View
eingefügt wird:
<%= render(:partial=>"cmi_messages/cmi_message_board.html.erb")%>
Sollen die Nachrichten zusätzlich über Juggernaut an die Clients verteilt werden,
so muss das Juggernaut Plug-In installiert, und der Juggernaut Server gestartet
werden. Alles Weitere geschieht transparent für den Benutzer.
Werden die Nachrichten über Juggernaut verteilt, so erfolgt dies synchron, und
beim Empfangen einer neuen Nachricht wird dies im Message Board angezeigt.
•
Chat
Der Embedded Chat wird durch ein separates Modul (cmi_embedded_chat)
realisiert. Für dieses Beispiel werden die Komponenten der Version integrated
installiert. Dies wird durch Aufruf des Generators mit dem Befehl ruby
script\generate cmi_embedded_chat --skip-independent erreicht. Nun ist
noch ein rake db:migrate erforderlich, und da jeder private Chatraum
bestimmten Benutzern zugeordnet ist, muss noch diese Assoziation durch
has_many :cmi_private_chat_rooms im User Model definiert werden.
Das Chat Board wird direkt ins Layout durch Einfügen folgender Zeile in der
Datei cooperation.html.erb eingebunden:
<%=render(:partial=>"cmi_embedded_chat/cmi_chat_board.html.erb")%>
Die Privaten Chatrooms werden über die Buddy List erzeugt, der Link dazu wird
in der Datei cmi_buddy_list_default_links.html.erb durch Einfügen folgenden
Codes erzeugt:
<%= link_to "Private chat",
{:controller => 'cmi_embedded_chat', :action => 'invite_private',
:params => { :client_id => a_user[:id],
:current_user_id => current_user.id } },
:popup => ['_blank','height=300,width=600,scrollbars=yes'] %><br/>
2009-09-10
96/107
Details zur Lösung
Generierte Modelle
Folgende Abbildung zeigt alle bisher generierten Modelle, und deren Beziehungen
zueinander:
Abb. 61: Schritt 6: Modelle und Beziehungen
Siehe auch:
cmi_message, Abschnitt 5.2.8
cmi_embedded_chat, Abschnitt 5.2.9
Juggernaut, Abschnitt 5.2.15
cmi_buddy_list, Abschnitt 5.2.4
Schritt 7: Zusammenarbeit und Synchrone Group Awareness
Aufgabenstellung
Durch synchrone Group Awareness soll die Zusammenarbeit unterstützt werden. In
einer synchronen Collaborative Session ist es wichtig, dass alle Benutzer darüber
informiert sind, welche anderen Benutzer sich gerade an der Sitzung beteiligen,
welchen Availability Status sie haben, und was sie gerade machen.
Beispiel CURE
In CURE wird Group Awareness während der synchronen Zusammenarbeit über die
User List erreicht. Alle Benutzer, die sich gerade im Raum befinden, werden in der
User List angezeigt. In der User List ist auch ersichtlich, auf welcher Seite sich die
Benutzer gerade befinden 55.
55
Siehe (Schümmer 2006, S. 13)
2009-09-10
97/107
Details zur Lösung
Abb. 62: User List in CURE, Quelle:(Schümmer 2006, S. 13)
Vergleich: Cooperation/CMI
Hier wird synchrone Group Awareness durch mehrere Elemente realisiert:
• Buddy List und Availability Status
Die Buddy List zeigt die Buddies zusammen mit deren Availability State an (siehe
Schritt 3 oben).
• User List
Die User List zeigt an, welche User sich gerade im Raum befinden (siehe
cmi_room).
• Collaborative Session View
Diese View zeigt den Collaborative Session State an, das heißt welche Tätigkeiten
die Benutzer in der Collaborative Session gerade ausführen.
Abb. 63: CMI User List und Collaborative Session State
Umsetzung (Collaborative Session)
Die Installation des Plug-Ins cmi_coll_session in die Anwendung erfolgt über ruby
script\generate cmi_coll_session cmi_rooms.
Danach wird die Migration durchgeführt, und das entsprechende Model (hier
CmiRoom) mit dem CmiCollSession Model assoziiert. Dies wird durch das Einfügen
folgender Zeile z.B. im CmiRoom Model erreicht:
has_and_belongs_to_many :cmi_coll_sessions
2009-09-10
98/107
Details zur Lösung
Jedesmal, wenn eine Session betreten wird, wird das CmiSession Objekt erzeugt,
bzw. aktualisiert. In diesem Beispiel geschieht dies jedesmal beim Betreten des
Raums in der Methode cmi_a_room des CmiRoomControllers:
CmiCollSession.enter_coll_session(@room, @user)
Das Ändern des Benutzerstatus (im Session Objekt) erfolgt ähnlich, ein Beispiel dazu
kann im ToursController in der Methode new_tour_room gefunden werden.
Die Session State View kann folgendermaßen in eine Anwendung eingebunden
werden (in der Beispielanwendung passt sie z.B. sehr gut in cmi_a_room.html.erb):
<%=render(:partial=>cmi_coll_session/cmi_coll_session_state.html.erb"
, :locals => {:room => @room}) %>
Generierte Modelle
Folgende Abbildung zeigt alle bisher generierten Modelle, und deren Beziehungen
zueinander:
Abb. 64: Schritt 7: Modelle und Beziehungen
Siehe auch:
cmi_coll_session, Abschnitt 5.2.13
Juggernaut, Abschnitt 5.2.15
cmi_buddy_list, Abschnitt 5.2.4
cmi_virtual_me, Abschnitt 5.2.2
2009-09-10
99/107
Zusammenfassung
6 Zusammenfassung
Zum Abschluss folgt nun noch einmal eine Zusammenfassung der Anforderungen,
und wie die Aufgabenstellung umgesetzt wurde.
Danach folgt ein Ausblick auf mögliche weitere Arbeiten auf diesem Gebiet, und es
wird aufgezeigt, welche Punkte im Rahmen dieser Arbeit nicht behandelt werden
konnten.
6.1 Wie wurde die Aufgabenstellung gelöst?
Motiviert von den Herausforderungen, die die Web 2.0 Generation an Groupware
Anwendungen stellt, war das Ziel dieser Arbeit, Kooperationsmodule für Ruby on
Rails zu entwickeln. Als Grundlage für die Realisierung der Module dienten die
Entwurfsmuster aus (Schümmer und Lukosch 2007).
Zu Beginn wurden die wichtigsten Entwurfsmuster ermittelt. Dazu wurde eine Studie
durchgeführt, die eine grobe Richtung für die Auswahl vorgab. Ein überraschendes
Ergebnis war dabei, dass sowohl die untersuchten Open Source Anwendungen, als
auch einige der untersuchten kommerziellen Anwendungen in Bezug auf Group
Awareness noch viel Verbesserungspotential aufweisen.
Im nächsten Schritt wurden die Anforderungen an kooperative Module in der Ruby on
Rails Umgebung ermittelt. Neben anderen Kriterien können dabei Modularität,
Verwendbarkeit und Konfigurierbarkeit als besonders wichtig hervorgehoben werden.
Danach wurde untersucht, ob unter den verfügbaren Plug-Ins geeignete
Kooperationsmodule für die Entwicklung einer Groupware Anwendung zu finden
sind. Erfreulich ist, dass für Ruby on Rails sehr viele qualitativ hochwertige Module
frei erhältlich sind, die bei Bedarf recht einfach anpassbar bzw. erweiterbar sind. Wie
sich gezeigt hat, sind kooperative Module jedoch kaum darunter zu finden.
Im Anschluss daran wurden die wichtigsten Module als Rails Plug-Ins umgesetzt,
wobei sich als Strategie zur Umsetzung der Aufgabenstellung recht schnell
herauskristallisiert hat, ausgehend von einem Basisprojekt, die meisten der
Entwurfsmuster als Plug-Ins selbst zu implementieren, und bei Bedarf und
Verfügbarkeit auf bestehende Plug-Ins zurückzugreifen.
Um der Anforderung der Modularität gerecht zu werden, wurden teilweise mehrere
Muster in einem Plug-In zusammengefasst. Mitunter war es recht schwierig, die
Entwurfsmuster den Modulen zuzuordnen, denn einerseits sollen die Module
möglichst lose gekoppelt, flexibel einsetzbar und nach Bedarf miteinander
kombinierbar sein, und andererseits sollen sie einfach zu installieren sein, was sich
widersprechen kann. Außerdem war es nicht immer leicht, die Grenze zwischen
Modul und Anwendung zu ziehen.
2009-09-10
100/107
Zusammenfassung
Die größte Herausforderung war aber mit Sicherheit die Umsetzung der
Entwurfsmuster, die synchronizität erfordern. Diese Muster wurden auf Basis des
Plug-Ins Juggernaut implementiert.
6.2 Ausblick
Eine Erkenntnis dieser Arbeit ist, dass in der Ruby on Rails Welt, besonders was die
Verfügbarkeit von Plug-Ins für kooperative Elemente betrifft, noch viel Aufholbedarf
besteht. Diesbezüglich leistet diese Arbeit einen ersten Beitrag.
Natürlich gibt es zu den implementierten Entwurfsmustern auch noch die eine oder
andere Idee zur Verbesserung bzw. Erweiterung. Interessanter erscheint jedoch, die
Bibliothek zu erweitern, und die noch offenen Entwurfsmuster ebenfalls als Plug-Ins
zu implementieren. Eine große Herausforderung stellen dabei sicherlich die noch
nicht implementierten Entwurfsmuster aus dem Cluster Synchronous Group
Awareness wie z.B. Remote Selection oder Remote Field of Vision dar, aber auch
andere Entwurfsmuster, wie z.B. Shared Editing, erscheinen für die Umsetzung
interessant zu sein. Der Bedarf besteht, wie die Untersuchung in Kapitel 3 gezeigt hat.
2009-09-10
101/107
Quellenverzeichnis
7 Quellenverzeichnis
Booch, Grady (1993): Object-Oriented Analysis and Design with Applications,
Addison-Wesley 2003, ISBN-10: 0805353402
Facebook (2009): Seite „Facebook“. In: Wikipedia, Die freie Enzyklopädie.
Bearbeitungsstand: 22. Mai 2009, 10:08 UTC. URL:
http://de.wikipedia.org/w/index.php?title=Facebook&oldid=60311407 (Abgerufen:
26. Mai 2009, 15:39 UTC)
Fischer Jens (2008): Professionelle Webentwicklung mit Ruby on Rails 2, mitp, 2008,
ISBN 978-3-8266-1683-9
Fowler Martin (2003): Patterns of Enterprise Application Architecture, Pearson
Education 2003, ISBN 0-321-12742-0
Fuks Hugo (2006): Development of Groupware based on the 3C Collaboration Model
and Component Technology, Hugo Fuks, 2006, http://groupware.les.inf.pucrio.br/groupware/publicacoes/CRIWG2006.pps
Gerosa et al (2006): Development of Groupware Based on the 3C Collaboration
Model and Component Technology, Marco Aurélio Gerosa et al., Springer Berlin /
Heidelberg, 2006, ISBN 978-3-540-39591-1
Haake Jörg M., Schümmer Till, Haake Anja, Bourimi Mohamed und Landgraf Britta
(2004): Supporting flexible collaborative distance learning in the CURE platform. In:
Proceedings of the 37th Hawaii International Conference on System Sciences - 2004.
2004, Hagen. S. 1.
Hansson David Heinemeier (2003): Web development that does not hurt,
http://rubyonrails.org/
Hansson David Heinemeier, Thomas Dave und Ruby Sam (2009): Agile Web
Development with Rails, Third Edition, The Pragmatic Bookshelf 2009, ISBN-10: 1934356-16-6
Jacobs Ian (2004): Architecture of the World Wide Web, Volume One, Introduction,
W3C 2004, http://www.w3.org/TR/webarch/
Kappel Gerti, Pröll Birgit, Reich Siegfried und Retschitzegger Werner (2004): Web
Engineering, Systematische Entwicklung von Web-Anwendungen, dpunkt 2004,
ISBN 3-89864-234-8
Kappel Gerti, Pröll Birgit, Reich Siegfried und Retschitzegger Werner (2006): Web
Engineering: The Discipline of Systematic Development of Web Applications, Wiley
2006, ISBN-13: 978-0470015544
2009-09-10
102/107
Quellenverzeichnis
Krasner Glenn E. und Pope Stephen T. (1988): A cookbook for using the model-view
controller user interface paradigm in Smalltalk-80, Journal of Object-Oriented
Programming, 1(3), 1988, ISSN:0896-8438
Hunt Andy (2000): Pragmatic Software Development Tips,
http://www.pragprog.com/the-pragmatic-programmer/extracts/tips
O'Reilly Tim (2006): Web 2.0 Compact Definition: Trying Again,
http://radar.oreilly.com/archives/2006/12/web-20-compact.html
Orsini Rob (2007): Rails Kochbuch, O’Reilly 2007, ISBN 978-3-89721-714-0
Rechenberg Peter und Pomberger Gustav (2002): Informatik-Handbuch, 3. Auflage,
Hanser 2002, ISBN 3-446-21842-4
Schümmer Till (2006): CURE in a Nutshell, FernUniversität in Hagen 2006,
http://mapper.fernuni-hagen.de/CURE/doc/Manual.pdf
Schümmer Till und Lukosch Stephan (2007): Patterns for Computer Mediated
Interaction, Wiley 2007, ISBN 978-0-470-02561-1
Wikibooks (2009a): Seite "Ruby on Rails/Getting Started/Convention Over
Configuration". In: Wikibooks. Bearbeitungsstand: 8 May 2009, 00:08. URL:
http://en.wikibooks.org/wiki/Ruby_on_Rails/Getting_Started/Convention_Over_Conf
iguration (Abgerufen: 1. Juni 2009, 22:43 UTC)
Wikibooks (2009b): Seite "Ruby Ruby on Rails/ActiveRecord". In: Wikibooks.
Bearbeitungsstand: 8 May 2009, 00:08. URL:
http://en.wikibooks.org/wiki/Ruby_on_Rails/ActiveRecord#Acts_as (Abgerufen: 4.
Juni 2009, 15:47 UTC)
Wikipedia (2009a): Seite "Endlicher Automat". In: Wikipedia, Die freie
Enzyklopädie. Bearbeitungsstand: 20. Mai 2009, 08:35 UTC. URL:
http://de.wikipedia.org/w/index.php?title=Endlicher_Automat&oldid=60243837
(Abgerufen: 1. Juni 2009, 16:02 UTC)
Wikipedia (2009b): Seite „Modularität“. In: Wikipedia, Die freie Enzyklopädie.
Bearbeitungsstand: 3. April 2009, 18:19 UTC. URL:
http://de.wikipedia.org/w/index.php?title=Modularit%C3%A4t&oldid=58645710
(Abgerufen: 10. Juni 2009, 14:42 UTC)
Winter Mario (2005): Methodische objektorientiert Softwareentwicklung,
dpunkt.verlag 2005, ISBN 3-89864-273-9
2009-09-10
103/107
Quellenverzeichnis
A. Anhang
1. Installation von Juggernaut
•
Ubuntu
Gegebenenfalls muss zuerst Flash installiert werden, dazu kann der Flash Player unter
folgendem link heruntergeladen werden:
http://get.adobe.com/flashplayer, dann .deb for Ubuntu 8.04+ (= 10.0 r15) auswählen.
Juggernaut kann problemlos, wie auf der Homepage beschrieben, installiert werden.
Von der Anleitung abweichend ist lediglich, dass die Installation des Plug-Ins selbst
durch ruby script/plugin install http://github.com/maccman/juggernautplugin.git/ erfolgt.
•
MS Windows
Flash: Die für diese Arbeit getestete und verwendete Version des Flash Players ist
10.0 r12
Leider lässt sich Juggernaut aufgrund des fehlenden C-Compilers unter MS Windows
nicht ohne weiteres installieren. Darum an dieser Stelle eine kurze Beschreibung, wie
Juggernaut auch auf MS Windows zum Einsatz gebracht werden kann:
o Installation von GitHub:
Juggernaut wird seit kurzem auf GitHub gehostet. Um Juggernaut von GitHub zu
installieren, muss man sich erst einen Zugang dafür verschaffen (siehe GitHub).
o Installation ohne GitHub
Da sich die Installation von der Anleitung auf der Homepage etwas unterscheidet,
wird der folgende Weg empfohlen (Quelle:
http://ctrlshiftesc.wordpress.com/2008/08/26/installing-juggernaut-gem-headachepainkiller/):
1.
2.
3.
4.
gem
gem
gem
gem
install
install
install
install
json
json_pure
eventmachine
juggernaut –ignore-dependencies
5. Nun folgende Änderung in der Datei
\ruby\lib\ruby\gems\1.8\specifications\juggernaut-0.5.4.gemspec im rubyVerzeichnis durchführen:
s.add_dependency(%q eventmachine, [">= 0.10.0"])
s.add_dependency(%q json, [">= 1.1.2"]) # —- ändern in 1.1.1
s.add_dependency(%q hoe, [">= 1.5.1"]) #— ändern in 1.3.1
6. Jetzt noch das Juggernaut-Plug-In ins plugins-Verzeichnis des Projekts
installieren: Wenn dazu die aktuelle Version von www.rubyforge.org
verwendet wird, erscheint eine Fehlermeldung ( „No expansion found for
:juggernaut" unter Rails 2.2.2). Deshalb wird empfohlen, entweder die aktuelle
Juggernaut-Version von GitHub zu installieren, oder das Plug-In aus dem
Cooperation- Repository auszuchecken. Die Installation des Plug-Ins wird
2009-09-10
104/107
Quellenverzeichnis
dann durch Angabe des Parameters --install-juggernaut bei der
Installation des jeweiligen CMI-Plug-Ins durchgeführt.
7. Juggernaut benötigt eine Konfigurationsdatei, die mittels juggernaut -g
juggernaut.yml ins Wurzelverzeichnis des Projekts kopiert wird. Alternativ
dazu kann auch die vorkonfigurierte Datei des CMI-Plug-Ins verwendet
werden, diese wird bei der Installation des Plug-Ins mit installiert (Vorsicht,
die eigenen Dateien ggf. vor der Installation des entsprechenden Plug-Ins
sichern).
8. Der Juggernaut Server wird mittels juggernaut -c juggernaut.yml
gestartet.
2. Installation von MiniMagick und ImageMagic auf MS Windows
Die Quelle für diese Beschreibung ist unter dem Link
http://samuelschroeder.com/2007/07/31/installing-imagemagick-and-minimagick-onwindows/ zu finden.
Beschreibung:
Um aus Bildern Thumbnails zu erzeugen, greift das Plug-In Attachment Fu auf eine
externe Komponente zurück. Eine von mehreren dafür geeigneten Komponenten ist
MiniMagick.
MiniMagick benötigt wiederum als Precondition das Programm ImageMagic.
•
ImageMagic installieren
Ein Setup für ImageMagic kann von http://www.imagemagick.org/script/binaryreleases.php#windows heruntergeladen werden, und wird wie in MS Windows
üblich installiert.
•
MiniMagick installieren
Entweder wird das gem durch gem install mini_magick installiert, oder man
lädt das Plug-In von http://rubyforge.org/frs/download.php/21736/mini_magick1.2.3.tgz herunter und kopiert es in das plugins Verzeichnis des Projekts (in dieser
Form ist das Plug-In auch im Repository enthalten, und kann direkt von dort
verwendet werden).
3. Installation von GitHub auf MS Windows
Die Homepage lässt sich über den Link http://github.com/ aufrufen.
Eine Anleitung, wie man sich Zugang zu GitHub verschafft, um Rails Plug-Ins von
GitHub auf einer MS Windows Plattform zu installieren, ist unter folgendem Link zu
finden:
http://jamie.ideasasylum.com/2008/08/installing-rails-plugins-with-git-on-windows/
2009-09-10
105/107
Quellenverzeichnis
4. Bekannte Fehler und deren Behebung
Fehlermeldung:
INSTALLDIR/vendor/plugins/juggernaut/lib/juggernaut.rb:5:in
`read': No such file or directory - INSTALLDIR /config/juggernaut_hosts.yml
(Errno::ENOENT)
• Ursache:
Sobald sich das Plug-In Juggernaut im plugins Verzeichnis befindet, versucht
Juggernaut, beim initialisieren auf die Konfigurationsdatei juggernaut_hosts.yml
zuzugreifen. Ist die Datei nicht vorhanden, erscheint diese Fehlermeldung.
• Behebung:
Falls Juggernaut verwendet werden soll, die entsprechende Datei ins config
Verzeichnis kopieren (ist im Repository vorhanden).
Sonst das gesamte Verzeichnis Juggernaut_plugin aus dem plugins-Verzeichnis
des Projekts löschen.
Fehlermeldung: Nachdem auf eine Seite zugegriffen wurde, erscheint folgende
Fehlermeldung im Logfile:
ActionController::RoutingError (No route matches
"/javascripts/widgets/tooltip.js" with {:method=>:get}):
•
•
Ursache:
Das Plug-In rails-widgets befindet sich im pluginsVerzeichnis, es wurde aber
(noch) nicht installiert.
Behebung:
Das Plug-In rails-widgets installieren (empfohlen), oder das gesamte Verzeichnis
aus dem plugins Verzeichnis entfernen.
Fehlermeldung im Logfile:
ActionController::RoutingError (No route matches
"/javascripts/juggernaut/juggernaut.js" with {:method=>:get}):
•
•
Ursache:
Juggernaut ist nicht richtig installiert.
Behebung:
Das Plug-In richtig installieren.
Fehlermeldung:
Wird der Juggernaut-Server gestoppt, so crasht Flash, wenn noch eine Verbindung zu
Juggernaut besteht.
• Behebung:
Vor dem Beenden des Juggernaut-Servers alle Verbindungen schließen.
Fehlermeldung:
"uninitialized constant CmiRemoteSubscriptionObserver (NameError)" beim starten
des Servers, oder:
`load_missing_constant': uninitialized constant CmiRemoteSubscriptionObserver
(NameError) beim installieren des Plug-Ins cmi_remote_subscription
• Ursache:
2009-09-10
106/107
Quellenverzeichnis
•
Möglicherweise ist der CmiRemoteSubscriptionObserver in der Datei
environment.rb registriert, der Observer befindet sich aber nicht (mehr) an der
richtigen Stelle im Models Verzeichnis.
Behebung:
Eintrag aus environment.rb löschen, oder das Plug-In neu installieren.
Fehlermeldung:
"Size is not included in the list" bei der Verwendung von Attachment Fu unter MS
MS Windows.
• Ursache:
Das Kopieren von Dateien unter MS Windows ist zu langsam.
• Behebung:
Siehe http://epirsch.blogspot.com/2008/01/fixing-attachmentfu-on-windowslike.html.
Fehlermeldung:
Wenn versucht wird, auf eine Seite zuzugreifen, erscheint die Meldung "undefined
method `has_attachment' for #<Class: ... >" im Webbrowser.
• Ursache:
Eine Komponente versucht, eine Methode des Plug-Ins Attachment Fu aufzurufen,
das Plug-In ist jedoch nicht installiert.
• Behebung:
Das Plug-In Attachment Fu installieren.
Fehlermeldung:
Die Ausführung einer Migration wird mit folgender Fehlermeldung abgebrochen:
"rake aborted!
Multiple migrations have the version number"
• Ursache:
CMI legt für jede Migration eine eigene Datei an. Wenn das Projekt so
konfiguriert ist, dass die Migrationen automatisch mittels UTC-based Migration
Versioning nummeriert werden, ergibt sich so ein Versionskonflikt zwischen
diesen Dateien.
• Behebung:
Das Projekt kann über die Datei environment.rb konfiguriert werden, so dass die
Migrationsdateien in aufsteigender Reihenfolge nummeriert werden:
config.active_record.timestamped_migrations = false
(Quelle: http://ryandaigle.com/articles/2008/4/2/what-s-new-in-edge-rails-utcbased-migration-versioning)
Danach die Migrationsdateien löschen, und das gewünschte Plug-In neu
installieren.
2009-09-10
107/107