Student Guide Java Client/Server anhand von Photo Communities Software Projekt im Rahmen der Vorlesung Java Client / Server Studiengang Computer Networking, Fachhochschule Furtwangen, WS 00/01 Team: Jörg Hühne Florian Leibenzeder Dominic Yow-Sin-Cheung Oliver Hilß Stefan Zier Student Guide Java Client/Server Photo Communities, CN7 WS00/01 1 Einleitung Erstellt werden soll ein webbasiertes, kooperatives Photoalbum. Verschiedene Benutzer können Fotos in einen gemeinsamen Speicherort laden, kategorisieren und publizieren. 1.1 Funktionale Anforderungen Es existiert ein gemeinsames Fotoalbum mit einer limitierten Anzahl vorgegebener Kategorien Benutzer können sich beim System authentifizieren Im System existiert ein Administrator Besucher können über ein Formular einen Account auf dem System beantragen, der Administrator wird per E-Mail benachrichtigt und kann den Benutzer-Account freischalten oder den Antrag ablehnen. Der Benutzer wird per E-Mail von der Entscheidung des Administrators benachrichtigt Benutzer können über ein Formular Fotos hochladen, eine Beschreibung eingeben und einer Kategorie zuordnen Benutzer und Gäste können die Fotos in den einzelnen Kategorien betrachten ____________________________________________________________________________ 2 Student Guide Java Client/Server Photo Communities, CN7 WS00/01 2 Umgebung 2.1 Technologien Die Anwendung sollte auf einer relationalen Datenbank aufsetzen, auf die per JDBC zugegriffen wurde. Um potentiell mehrere Anwendungen auf dem gleichen Datenbestand aufsetzen zu können und vor allem weil es technisch interessant war, wurde ein objektorientierter Datenbankwrapper entwickelt, der seine Services per CORBA zur Verfügung stellt. Die eigentliche Anwendung bestand aus Java Servlets zur dynamischen Generierung des HTMLCodes, die die Services des Datenbank-Wrappers nutzten. Zum Versand von E-Mails an Benutzer des Systems kam weiterhin die Java Mail API zum Einsatz. 2.2 Runtime Tools Java Development Kit 1.2.2-006 für Win32 und Linux Inprise VisiBroker 4.11 für Win32 und Linux (Trial) Apache Jakarta Tomcat 3.1 MySQL 3.23.25 beta MySQL JDBC Driver 2.0.2 Java Mail API 1.1.3 (und Java Activation Framework 1.0.1) Servertec IWS FileUpload Classes 2.3 Development Tools Inprise JBuilder 4.0 Foundation CVS 1.10.5 Win32 und Linux Apache Ant 1.1 TogetherJ 4.01 ____________________________________________________________________________ 3 Student Guide Java Client/Server Photo Communities, CN7 WS00/01 3 Erfahrungen 3.1 Technologien Der Umgang mit den Technologien verlief aufgrund ihrer Ausgereiftheit weitgehend problemlos. Die Mail API bot ein für diesen Zweck etwas zu umfangreiches API, das einen gewissen Einarbeitungsaufwand erfordert. Da bei Servlets meistens nur die service()-Methode zu implementieren war, gestaltete sich deren Programmierung recht einfach. Unschön war allerdings die Vermischung des HTMLCodes mit dem Programmcode. Dies ließe sich zwar durch eine Template-Engine lösen, doch ist der Einsatz mit einem Mehraufwand behaftet, der für diese Beispiel-Anwendung nicht gerechtfertigt war. Zunächst achteten einige Teammitglieder auch nicht auf die Thread-Safety der Servlets. Sie überschrieben Instanzvariablen des Servlets in der service()-Methode. Bei mehreren gleichzeitig ablaufenden Requests hätten sich so die einzelnen Threads gegenseitig Variablenwerte überschreiben können. Die JDBC API ist so gehalten, daß man mit einer kleinen Teilmenge bereits gut arbeiten kann. Geht man nach Beispielen aus zahlreichen Tutorials von Sun vor, kann man schon in kurzer Zeit zum Test ein SELECT-Statement absetzen. Aufwändiger war der Einsatz von PreparedStatements in Verbindung mit einem Connection-Pool. In Produktionsumgebungen ist dies jedoch die Regel, da nur so mehrere Anfragen zur Datenbank gleichzeitig laufen können. Deshalb erschien es uns auch interessant, einen einfachen Pool selbst zu implementieren. In einem Connection-Pool wird eine bestimmte Anzahl von Datenbank-Verbindungen schon im voraus erstellt und Client-Threads bei Bedarf zur Verfügung gestellt. Der Hintergrund ist, daß der Aufbau einer Verbindung zeitlich recht teuer ist. Um den Pool flexibel zu halten, können Anzahl der vorgehaltenen Verbindungen, TreiberName, Datenbank-URL und Login-Daten über eine Konfigurationsdatei festgelegt werden. Der CORBA Datenbank-Wrapper stellt für jede Tabelle in der Datenbank einen Service zur Verfügung, auf den über eine definierte Schnittstelle zugegriffen wird. Probleme bereiteten hier CORBA-spezifische Besonderheiten. Zum Beispiel, kann CORBA keine null-Werte übertragen. Liefert ein Methodenaufruf null an den ORB zurück, so bekommt der Client eine CORBA_UNKNOWN SystemException. Aufgrund der einfach gehaltenen Interface-Definition, hielten sich die Probleme bei der Implementierung jedoch in Grenzen. 3.2 Tools Das JDK lief wie man es von einem Production Release erwartet völlig problemlos auf beiden Plattformen. Kompatibilitätsprobleme zwischen den Plattformen traten nicht auf. VisiBroker hatte mit dem eingesetzten SmartAgent (eine proprietäre CORBA-Erweiterung zum einfachen Discovery von Services per UDP-Broadcast) auf der Win32-Plattform einige Stabilitätsprobleme. Es passierte öfters, daß die CORBA-Kommunikation erst nach einem Neustart des SmartAgent Dienstes wieder funktionierte. Apache Tomcat geht bei der Konfiguration teils etwas unkonventionelle Wege, so daß man eine Weile benötigt, bis man die XML-Konfigurationsdateien verstanden hat. Der Lernaufwand hält sich aber in Grenzen. MySQL ist im Vergleich zu kommerziellen Datenbanken äusserst spartanisch ausgestattet, zeigte sich aber als stabil. Die für Win32 mitgelieferten Wartungstools waren jedoch von geringer Qualität. So war zum einen die Benutzerschnittstelle äusserst unkonventionell und erforderte einigen Einarbeitungsaufwand. Zudem gab es öfters Abstürze der Wartungstools. Zu ____________________________________________________________________________ 4 Student Guide Java Client/Server Photo Communities, CN7 WS00/01 bemerken bleibt, daß MySQL keine referentielle Integrität garantiert. Der JDBC-Treiber funktionierte für die recht einfachen Queries der Anwendung mit Statements und PreparedStatements problemlos. Außer dem oben bemängelten komplexen API traten mit der Mail API keine Probleme auf. Die Sun Implementation funktionierte stets zuverlässig zum Mail-Versand per SMTP. Der File-Upload war recht schnell und problemlos zu implementieren. Wir verwendeten die Mulitpart-FileUpload Klassen von Servertec. Sie stellen alle nötigen Funktionen für den File Upload zur Verfügung. Das parsen von HTTP Multipart-Form Requests stellt dabei die wichtigste Funktion dar. Die Klassen bieten Methoden, die diese Aufgabe übernehmen. Es wird eine Hashtable zurückgegeben, welche die FileUpload-Objekte enthält. Diese können benutzt werden, um Eigenschaften der hochgeladenen Dateien, zum Beispiel Name und ContentType, zu bestimmen. TogetherJ ist inzwischen ein erwachsenes UML CASE-Tool, das den Vergleich mit Rational Rose nicht zu scheuen braucht. Im Gegensatz zu Rose benutzt TogetherJ den Quellcode als einzigen Ort zur Datenablage, so ist gewährleistet, daß Modell und Code immer synchron sind. Bei unserem Projekt kam TogetherJ in der Anfangsphase fuer das Design der Use Cases und der Klassendiagramme zum Einsatz. Sicherlich wäre für ein Projekt in der Grössenordung unserer Anwendung auch ein einfaches Grafikprogramm oder Diagrammtool wie Visio ausreichend gewesen, doch stand auch hier eher der Gedanke der Tool Evaluierung in Bezug auf Funktioalität und Anwendbarkeit im Fordergrund. Anfangs stand uns nur die Whiteboard-Edition zur Verfügung. Obwohl man damit durchaus einen Enblick in das Produkt erhalten kann, fehlten selbst für unsere geringen Anforderungen einige wichtige Funktionen, die den sinnvollen Einsatz erschwerten. Mit der befristeten Hochschul-Lizenz, die vom Funktionsumfang her der Vollversion entspricht, konnten wir dann aber produktiv arbeiten. JBuilder erwies sich als kostengünstige und äusserst ausgereifte Entwicklungsumgebung. Da die Version 4.0 nun auf JDK 1.3 aufbaut, das unter Win32 eine erheblich beschleunigte Grafikdarstellung bei Swing-Applikationen hat, ist das Arbeiten gegenüber älteren Versionen merklich weniger zäh. Die kostenpflichtige Enterprise-Version bietet sogar direkt Tools zur Entwicklung von CORBA IDLs und integriert CVS. Die Teammitglieder, die CVS noch nie benutzt hatten, hatten ursprünglich leichtere Verständnisprobleme mit der Funktionsweise des Systems. Nachdem diese aus dem Weg geschafft waren, gab es immer wieder Situationen, in denen ein Update nicht sichtbar wurde. Alle waren auf Bedienungsfehler zurückzuführen, aber sorgten stets für Frust, weil es viel Zeit kostete, den Grund zu finden und zu beheben. Zudem kam es öfters vor, daß binäre Files versehentlich ohne die Option –kb eingecheckt wurden und somit nur bis zum ersten carriage return im Repository waren. Ant war für jemanden, der vorher schon Make verwendet hatte, sehr einfach anhand von Beispielen zu erlernen. Es bietet viele Vorteile gegenüber Make, z.B. einfacher Umgang mit Unterverzeichnissen, einfache Integration von CVS und Javadoc und bessere Abstimmung auf Java. So muß zum Beispiel nicht für jeden einzelnen Kompiliervorgang eine neue JVM gestartet werden, was viel Zeit spart. Bugs konnten wir nicht feststellen, die Anwendung war, sobald die build.xml erstellt war, denkbar einfach. Für Verwirrung sorgte auch die Handhabung von Dateipfaden. Da sie in Windows und UNIX unterschiedlich aufgebaut werden, kann dies schnell zu Exceptions beim Schreiben oder Auslesen von Dateien führen. Insgesamt muss gesagt werden, dass das Aufsetzen der kompletten Entwicklungsumgebung nicht trivial war und einiges an Zeit in Anspruch nahm, besonders weil einige der Komponenten Neuland für die meisten Teammitglieder waren. Die Installation der einzelnen Tools war besonders unter Windows kein Problem. Die Integration aller Komponenten in ein harmonierendes Entwicklungssystem, mit Einbindung aller notwendigen Libraries und ____________________________________________________________________________ 5 Student Guide Java Client/Server Photo Communities, CN7 WS00/01 Debugging für Servlets und CORBA Services direkt in der Entwicklungsumgebung, erforderte doch einiges an Einarbeitungszeit. 3.3 Prozess Zur Entwicklung der Software wurde zunächst ein iterativer Prozess mit zwei Iterationen vorgeschlagen. Nach der ersten Iteration sollte eine Implementation des Systems ohne CORBA funktionsfähig sein. Die zweite Iteration sollte dazu dienen, CORBA in das System einzufügen. Dieser Ansatz erwies sich leider als unpassend, da eine nachträgliche Umstellung auf CORBA zu viel Redesign erfordert hätte. Glücklicherweise fiel uns dieser Umstand recht früh auf. Wir entschieden dann, die beiden Iterationen zu einer zusammenzufassen. Die Komponenten des Systems wurden in folgender Reihenfolge entwickelt: Datenbankschema IDL für den Datenbank-Wrapper Zeitgleich: Datenbank-Wrapper und Servlets Die Reihenfolge erwies sich als gut, wobei aber bei der zeitgleichen Entwicklung von Wrapper und Servlets ein erhebliches Maß an Kommunikation zwischen den beiden Teams nötig war, um sich über den aktuellen Stand der Implementation auf dem Laufenden zu halten. Hierfür erwies sich aufgrund der räumlichen Verteilung der Projektmitglieder das Instant Messaging Tool ICQ als äusserst hilfreich. ____________________________________________________________________________ 6 Student Guide Java Client/Server Photo Communities, CN7 WS00/01 4 Zusammenfassung Insgesamt betrachtet funktionierte die Teamarbeit äußerst gut, unter anderem weil sich alle Teammitglieder schon länger kannten und gut miteinander zurecht kamen. Das technische Zusammenspiel der Komponenten funktionierte ebenfalls äußerst gut. Wie schon erwähnt, macht der Aufbau einer entsprechenden Programmierumgebung einen nicht unerheblichen Teil des gesamten Arbeitsaufwandes aus. So schlug die Selektion der verwendeten Tools sowie deren sinnvolle Integration durch Anpassung von Konfigurationsdateien und Erstellung von entsprechenden Batch-Dateien mit schätzungsweise 30% des Projektaufwandes zu Buche. Bei grüßeren Projekten relativiert sich dieser einmalige Aufwand allerdings recht schnell. Zu bemerken bleibt, daß die Software nicht unter Last getestet wurde, die oben beschriebenen, recht positiven, Ergebnisse hätten unter Last anders ausfallen können. ____________________________________________________________________________ 7 Student Guide Java Client/Server Photo Communities, CN7 WS00/01 5 Links Abschließend noch eine Sammlung mit Links zu den verwendeten Tools. Neben dem Download der Softwarepakete findet man hier natürlich auch Dokumentation zu den Werkzeugen. Weiterhin sei auch immer auf die zu den Tools mitgelieferte Dokumentation verwiesen, die in der Regel eingehende Installationsanweisungen und Beispielkonfigurationen bietet. Java JDK & APIs: Jakarta Tomcat: Ant: Jbuilder: VisiBroker: TogetherJ: MySQL: MySQL JDBC Driver: http://java.sun.com/products http://jakarta.apache.org/ http://jakarta.apache.org/ant/index.html http://www.borland.com/jbuilder/ http://www.borland.com/visibroker/ http://www.togethersoft.com/ http://www.mysql.com/ http://mmmysql.sourceforge.net/ ____________________________________________________________________________ 8