Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: flaite am 14.01.06 - 10:36:47

Titel: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 14.01.06 - 10:36:47
Hi,

hier ein paar gesammelte Infos für den Swing Client für !!Help!!:
1. Swing ist eine komplexe Library. Ich hab relativ wenig Erfahrung damit. Mein Problem mit Swing Anwendungen war immer, dass mit den ganzen Listenern, Adaptern, Widgets, Models, Threading-Zeugs, etc. das ganze immer hin zu einem schwer zu maintainenden Chaos tendierte.
In diesem Projekt versuche ich nun - basierend auf einem Buch von Scott Delap - gewisse Architektur- und Designrichtlinien einzubauen, so dass es mit wachsender Größe maintainable bleibt. Dies könnte vielleicht für andere interessant sein, die ebenfalls mit Spwing (oder einer anderen GUI-Library) arbeiten. Viele der Ideen lassen sich vermutlich auch auf swt/JFace übertragen. Ich werde dazu noch was in hoffentlich verständlichen Form posten. Wenn ich bestimmte Konzepte erstmal nicht so schnell kapiere (aktuell namentlich Binding und Validation Libraries von Karsten Lentzsch) gehe ich in eng abgegrenzten Teilbereichen erstmal Low Tech, um Funktionalitäten zu implementieren. Dies schreib ich dann aber später um.

2. Ich kann dieses Projekt auf sourceforge.net publizieren. So können andere leicht auf den Code zugreifen. Ich hab vor bis spätestens Montag den Source ins cvs meines Sourceforge.net -Projekts zu bringen. Würd mich über Mitarbeit, Code-Bashing und Vorschläge freuen.

3. Dieses Projekt benutzt als Datenbasis den Webservices Layer der erfolgreichen Domino Helpdesk Anwendung !!Help!! von Thomas und Ulrich. Der Webservices-Producer Teil auf der HELP Seite ist zur Zeit noch eine Art Technologie-Proof-Of-Concept. Wir wollen nun bald eine fachliche Analyse der Anforderungen an einen Webservices Client durchführen und damit den Service entsprechend designen, dass er auch wirklich aus Sicht eines potentiellen Anwenders sinnvoll einzusetzen ist. Ich bemühe mich auch deshalb um eine solide Codebasis, um auf Erweiterungen/Änderungen des Webservices Producers auf HELP Seite schnell reagieren zu können. Dieses Projekt soll uns auch dazu dienen, Webservices vernünftig zu planen und zu designen.

4. Es existiert eine strenge Trennung zwischen GUI-Layer sowie den separierten Business und Service Layern. Die Business und Service Layer können später wiederverwendet werden, um z.B. mit Servlets/JSPs oder auch Mobile Java darauf zuzugreifen, wobei mit Mobile Java die Service und Business Layer leicht auf J2ME umgeschrieben werden müßten. Als Framework für Servlets/JSP schwebt mir Spring mit Webworks2 vor, aber das ist Zukunftsmusik.

5. Genau wie !!HELP!! besitzt dieses Projekt Unterstützung für Internationalisierung/Lokalisierung.

Unten der aktuelle Screenshot mit englischem Locale.

Gruß Axel
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 15.01.06 - 20:51:37
Tja. Da rede ich so groß von: Wir-müssen-erstmal-eine-Design-Analyse machen und ich verliebe mich in Swing-the-Scott-Delap-way.  ;D
Ich unterstütze jetzt verschiedene Ansichten.
Hab mir überlegt, dass man 2 "Navigatoren" anbietet:
1. für die Tickets an denen der User selbst beteiligt ist
2. Alle Tickets.

Der Anwender kann dann auswählen.

Ich hab jetzt die ganze Zeit an Punkt 1) gearbeitet. Hier sind verschieden sortierte Ansichten möglich (fertig ist: der User als Supporter, sortiert nach Status und nach Ersteller).
Die beiden Ansichten sind immer synchronisiert. Die Auswahl nicht. Ist aber erstmal nicht so wichtig.
Im Test benutze ich den User Heinz Ulrich Krause. Geht eigentlich ganz gut. Im Inneren werden es auch eher weniger als mehr öffentliche Methoden und das ist ein gutes Zeichen:
Der Prozess ist nicht unbedingt schnell aber kontrolliert. Aber ich lerne ja auch viel dabei.
Ulrich sollte mal ein titleProperty für TICKET und TICKETDETAIL spendieren.  ;D



Axel

Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: eknori am 16.01.06 - 14:56:49
Zitat
Ulrich sollte mal ein titleProperty für TICKET und TICKETDETAIL spendieren.

gerne, was soll denn da drinstehen ?
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 16.01.06 - 15:43:12
Das ist eine gute Frage. Ich hätte einen Titel erwartet. Aber tatsächlich wird in HELP auch Problem in den Ansichten verwendet. Und da kann sehr viel drinstehen.
Zumindest in einem JTree halte ich das darstellungstechnisch für problematisch, auch wenn es technologisch machbar ist. Werd mir wohl fürs erste die ersten 20 Zeichen von problem holen.

Was mir jetzt bei HELP aufgefallen ist, sind die Auswahllisten (z.B. die Felder application, failureType und failureSubType). Für bestimmte Dokumente vom Typ  "CONFIG":"CONFIGDEPENDAND" sollte es imho einen eigenen WSDL geben (find ich). Solche Konfigurationseinstellungen können dann im Client in einer eingebetteten HSQL oder Derby-Datenbank abgespeichert werden. So werd ichs in Java machen.
Der Swing Client kann ja einfach die Dokumente so wie in Notes darstellen.
Bitte schicke Datumsfelder nicht als String sondern als Datum runter.

Was ich nicht kapiere sind Aktionen und Teilaufgaben. Gibt es da eine Beschreibung für?



Übrigens gilt auch für die Internationalisierung, dass dies am besten synchronisiert wird. Ich hab mir bisher im Client meine eigene Mapping-Tabelle geschrieben. Ich sollte die gleichen Keys wie ihr in LanguageDocs verwenden. Ist es eigentlich normal, dass meine deutschen LanguageDocs alle englisch sind?

Gruß Axel
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: eknori am 16.01.06 - 17:14:05
Zitat
Was ich nicht kapiere sind Aktionen und Teilaufgaben. Gibt es da eine Beschreibung für?

Die Aktionen stammen aus der Ur-Zeit der Anwendung. Da habe ich einfach nur eine Möglichkeit eingebaut, Einzelaktionen zack zack hintereinander einzugeben. Quasi als Info, wenn mehrere an einem Ticket arbeiten.
Die werden aber spätestens in V 2.0 ebenso wegfallen, wie der Reiter Historie. Die Teilaufgaben werden die Aktionen ersetzen.

Beim Titel hatte ich eigendlich gedacht, daß man sich consumerseitig aus den übermittelten responses was passendes zusammenklöppelt. Mögicherweise habe ich da aber einen Denkfehler.

Zitat
Für bestimmte Dokumente vom Typ  "CONFIG":"CONFIGDEPENDAND" sollte es imho einen eigenen WSDL geben (find ich).

sehe ich genau so ...

Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: Thomas Schulte am 16.01.06 - 18:01:18
Äh nein Ulrich, da gibt es ein Veto von mir  8)...

Die Aktion binden noch ein paar Sachen mehr ein, die man mit Teilaufgaben nicht lösen kann. Sie sind zum Beispiel dafür notwendig um zu einem Ticket oder einer Aufgabe gehörende Zeiten die für Auswertungen benötigt werden zu erfassen. Wo ich dir zustimme, was wegfallen kann ist ein Teil der Historie, soweit er nicht für Feldänderungsüberwachungen benutzt wird.
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 16.01.06 - 18:08:27
sehe ich genau so ...
Ich schreibs in den Wiki als Use Case. Die LanguageDocs können in das selbe WSDL aber als eigene Funktion. Das ist eigentlich alles sehr einfach. Die Languagedocs haben mehrere Schlüssel. Ich kann aber davon ausgehen, dass die einzelnen Schlüssel eindeutig sind?
Das heisst das in LanguageDoc A und LanguageDoc B nicht der gleiche Schlüssel auftaucht.
Am elegantesten wäre es eine List runterzuschicken. Weiss aber nicht, ob Domino Webservices das unterstützen.

@Thomas: Wie funktioniert die Zeitmessung?


Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: Thomas Schulte am 16.01.06 - 18:33:27
Aktuell manuell. Weil du ja nicht definieren kannst ob er das Dokument die ganze Zeit offen hatte.

Was die LanguageDocs angeht. Äh nein, du kannst nicht davon ausgehen das die Schlüssel von zwei unterschiedlichen Dokumenten nicht gleich sind. Es wäre durchaus möglich das irgendwann jemand denselben Key zweimal vergibt.
Innerhalb eines dokumentes sollte ein Schlüssel aber nur einmal vorkommen. Wobei es bei unserem Ansatz im Moment auch egal ist ob er in dem Dokument zweimal vorkommt. Dann wird halt nur das erste Vorkommen als gültig angesehen.
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: eknori am 16.01.06 - 18:34:52
Das Wiki ist übrigens unter http://eknori.dyndns.org/wiki.nsf/Pages/WebServices zu erreichen.
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 16.01.06 - 21:27:10
Aktuell manuell. Weil du ja nicht definieren kannst ob er das Dokument die ganze Zeit offen hatte.
Anders funktioniert es auch in keinem anderen mir bekannten Helpdesk-System. Anders wäre auch Fließband-Arbeit.
Zitat
Was die LanguageDocs angeht. Äh nein, du kannst nicht davon ausgehen das die Schlüssel von zwei unterschiedlichen Dokumenten nicht gleich sind. Es wäre durchaus möglich das irgendwann jemand denselben Key zweimal vergibt.
Innerhalb eines dokumentes sollte ein Schlüssel aber nur einmal vorkommen. Wobei es bei unserem Ansatz im Moment auch egal ist ob er in dem Dokument zweimal vorkommt. Dann wird halt nur das erste Vorkommen als gültig angesehen.
thx.
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 16.01.06 - 21:42:21
Das Wiki ist übrigens unter http://eknori.dyndns.org/wiki.nsf/Pages/WebServices zu erreichen.
Ich würde mich freuen, wenn sich auch andere da beteiligen würden. Namentlich v.a. an dieser Stelle Thomas Schulte. Sagt mir, wenn ich unverständlich werde, blödsinn rede, umständlich oder selbstberaucht bin. Aber checke bitte die nichtfunktionalen Anforderungen. Vielleicht habe ich etwas übersehen.
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 17.01.06 - 01:54:19
Ich mach das erstmal auf deutsch, hab aber auf openNTF gepostet, falls Interesse besteht.
http://www.openntf.org/mainbar.nsf/WebBoardSub?OpenView&RestrictToCategory=DAFC0E751E32D38D862570F800835033&Count=30&ExpandSection=1#top
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 17.01.06 - 21:30:57
Ich hab den ersten Anwendungsfall durchformuliert.
Für mich ist es eine Hilfe.
Da ich nicht gerade wenig in den Wiki geschrieben, würde mich interessieren, ob andere die das lesen finden, ob das hilfreich ist, wo nicht, etc.
Nur der erste ist bisher fertig.
Zumindest halte ich die Liste für relativ vollständig.
Ich denke, dass man so schon ein paar Dinge erkennen kann, bevor wir weiter kodieren. Sicher nicht alles. Aber darum geht es nicht.

Axel
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 19.01.06 - 22:50:12
Nicht überraschende Entdeckungen bei Anwendungsfällen bisher (keine Überraschung):
HELP als Notes Datenbank besitzt 2 Services die unbedingt noch integriert werden müssen:
1. Locking.
2. Zugriffsrechte. Zugriffsrechte ist noch nicht so richtig ausgearbeitet.
Die sich daraus ergebende Komplexität erscheint mir nicht besonders hoch.

Nachdem jetzt die Anwendungsfälle bald ausreichend fertig sind, werde ich einen vollständigen Gui-Prototypen ohne Funktionalität und die neuen serverseitigen Webservice Interfaces schreiben.

Ich lasse wohl in der ersten Version das Anhängefeld im 3. Reiter und die Technotes weg. Kann das dann in der 2. Version einfügen.

Gruß Axel
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 24.01.06 - 22:11:09
Swing. Ich habs vor 2 Jahren das letztemal angefasst.

Hier ein Zwischenbericht:
Das macht viel Sinn:
http://martinfowler.com/eaaDev/PresentationModel.html
Zitat
Presentation Model pulls the state and behavior of the view out into a model class that is part of the presentation. The Presentation Model coordinates with the domain layer and provides an interface to the view that minimizes decision making in the view. The view either stores all its state in the Presentation Model or synchonizes its state with Presentation Model frequently
Wobei es bei mir - basierend auf Scottie Delap - eine Haupt-PresentationModel Klasse und für logisch zusammenhängende Teilbereiche (etwa die recht umfangreichen und smarten Navigationsbäume) ein sub-PresentationModel gibt.
GUIs sind scheissendreck-kompliziert. Ajax-Anwendungen versuchen diese Komplexität nun erst in den Bereich Webprogrammierung zu bringen. Die innere Komplexität bringt dem Anwender eine bessere Usability.
Die Notes-UI wurde nach dem Prinzip robust, konsistente "eigene" Standard-Logik, aber eben nicht unbedingt hohe Usability programmiert.
Dies eröffnet extra-Möglichkeiten in Hannover, aber eben auch extra Arbeit. Das oben angesprochene Pattern kann die benötigte Übersichtlichkeit bieten, die man als Entwickler benötigt.

+ Die Zeiten von GridBackLayout sind vorbei. Es gibt heute gute Layoutmanager, die einfach zu programmieren sind. Formlayout von Carsten Lentzsch oder der neue von Netbeans 5, der überdies noch eine gute IDE Unterstützung hat.

+ Swing Komponenten können mit ihren Millionen von Listenern, Teil-Objekten, etc. zwischendurch mal nervend komplex sein. Gute Swing Komponenten Bücher haben oft über 1.000 Seiten. Nur braucht man eben immer nur einen Teil davon. Und damit gehts. JTabPane (20 Seiten), JTree (120 Seiten). Der Aufbau ist auch relativ konsistent.

+ Es gibt Threading Issues. Swing horcht immer auf einen AWT-Event Queue:
- die EventListener laufen da drin.
- Repainting findet da drin statt.
Zeitraubendere Ressourcen muß man aus diesem Thread raushalten. Dafür gibt es SwingUtilities.invokeLater(), SwingUtilities.invokeAndWait() (braucht man seltener).
Sun hat eine Klasse SwingWorker, die das ganze mehr manageable macht. Dies ist nicht Bestandteil des JDKs!. Es gibt eine neue verbesserte Java5 Version. (suche auf java.net).
Dann gibts noch eine openSource Projekt Foxtrott. Das macht das ganze noch einfacher.
Jeder, der Swing programmiert, muß das berücksichtigen.
http://www.javalobby.org/members-only/eps/galbraith-swing-2/?source=archives

Wenn wir Threading haben, gibt es Asynchronität. Und daran sind wir alle miteinander nicht besonders gewöhnt. Für einen "normalen" Entwickler läuft code eine Zeile nach der anderen ab. Mit Asynchronität laufen aber code-Bestandteile beängstigend parallel.
Beispiel:
-> Der Anwender klickt auf einen Button: Hole mir alle Tickets von Helpdesk. Dies wird eine Weile dauern.
-> Vielleicht ist es sinnvoll, dass der User in der zwischenzeit etwas anderes machen kann (bei sehr langlaufenden Prozessen). Oder einfach, dass die GUI nicht einfrieren soll.
-> Nun gibt es aber Operationen, die der User in der Zwischenzeit nicht ausführen darf: Etwa ein Ticket anzeigen.
Ein Ticket anzeigen geht zwar auch über den Webservice, aber wesentlich schneller.
Also
1. User klickt auf "alle Tickets holen"
2. User klickt auf "Ticket A anzeigen"
3. Ticket A kommt zurück: wird angezeigt.
4. Alle Tickets kommen zurück (obwohl der User, das zuerst angefordert hat).
Und JETZT KOMMT DER PUNKT: "Alle Tickets kommen zurück" ist so programmiert, dass es die Anzeige in der spezielles-Ticket-Maske löscht, weil das u.U. nicht mehr aktuell ist!!!
Das heisst das Ergebnis von Operation 2 ist schneller da als die von Operation 1. Und wenn das ERgebnis von Operation 1 das von Operation 2 überschreibt, hat der Anwender ein Verständnisproblem und wir ein Problem.
Man muß also diese Operationen irgendwie synchronisieren. 
Und das ist die Komplexiät von Asynchronität.
Und mit Zeugs wie Websphere MQ, mehr multi-Threading, Ajax, etc. wird es asynchroner.
Das gibt Vorteile für die usability, aber auch mehr Komplexität für den Entwickler.

+ Validation ist eine Sache, für die es (auch von Carsten Lentzsch) ein gutes openSource Projekt gibt. Unbedingt benutzen, sonst erzeugt man unübersichtlichen Code.

+  Es führt oft zu viel unübersichtlicheren code, wenn man Objekte aus dem Business Modell in die Gui reinholen will. Dafür gibt es ein - nicht einfaches aber sehr interessantes - openSource Projekt von Carsten Lentzsch (schon wieder). Auf Javalobby gibts dafür ein mehrteiliges Tutorial. Automatisches Binding ist btw. eine Sache, die glaub ich ziemlich stark in Ruby-on_rails vertreten ist, in .NET eine Rolle spielt und auch beim xml processing von doc/lit-style Webservices.

Wenn man das alles berücksichtigt, kann Swing Spaß machen.
Es wird alles in Scott Delaps Buch in SourceBeat beschrieben. Imho liegen seine Stärken nicht unbedingt im Erklären, aber es ist ein gutes Buch.

Gruß Axel
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 28.01.06 - 09:58:47
Eine grundsätzlich gute Idee beim Entwickeln mit axis clients ist:
Diese Datei
Code
 <deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<handler name="log" type="java:org.apache.axis.handlers.LogHandler"/>

<globalConfiguration>
<requestFlow>
<handler type="log"/>
</requestFlow>
<responseFlow>
<handler type="log"/>
</responseFlow>
</globalConfiguration>

<transport
name="http"
pivot="java:org.apache.axis.transport.http.HTTPSender"/>

</deployment>
in einen root classpath des Projekts tun und client-config.wsdl nennen.

Axis schreibt dann die ausgetauschten webservice-requests/responses in eine Datei axis.log.
Ich hab noch nicht herausgefunden, wie man das per log4j.xml umlenken kann.
Jedenfalls kriegt man eine Menge Informationen über axis-request & axis-response, ohne dass man großartig http-Interceptoren einklinkt. :
Zeit, In message (an den Server) UND Out message (vom Server).
Bsp:
Code
=======================================================
= Elapsed: 953 milliseconds
= In message: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:GETALLTICKETSBYUSER soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:DefaultNamespace"><STRUSER xsi:type="xsd:string">Heinz Ulrich Krause</STRUSER></ns1:GETALLTICKETSBYUSER></soapenv:Body></soapenv:Envelope>
= Out message: <?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
 <soapenv:Body>
  <ns1:GETALLTICKETSBYUSERResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:DefaultNamespace"><GETALLTICKETSBYUSERReturn xsi:type="ns1:TICKETCOLLECTION"><TICKETS xsi:type="soapenc:Array" soapenc:arrayType="ns1:TICKET[39]"><item xsi:type="ns1:TICKET"><USER xsi:type="xsd:string">Heinz Ulrich Krause</USER><TICKETNUMBER xsi:type="xsd:string">COMM-6JXHE9</TICKETNUMBER><ACTIONBY xsi:type="xsd:string"/><PROBLEM xsi:type="xsd:string">This ticket is created using the &quot;Quick Call&quot; form</PROBLEM>
[...STARK VERKÜRZT...]
<xsi:type="xsd:string">Heinz Ulrich Krause</USER><TICKETNUMBER xsi:type="xsd:string">COMM-6LFNXJ</TICKETNUMBER><ACTIONBY xsi:type="xsd:string"/><PROBLEM xsi:type="xsd:string">ddddasd</PROBLEM><STATUS xsi:type="xsd:string">0</STATUS><AUTHUSER xsi:type="xsd:string">CN=COMM1/O=Witte/C=de</AUTHUSER></item></TICKETS><TICKETCOUNT xsi:type="xsd:short">39</TICKETCOUNT><ERRORCODE xsi:type="xsd:short">0</ERRORCODE></GETALLTICKETSBYUSERReturn></ns1:GETALLTICKETSBYUSERResponse>
 </soapenv:Body>
</soapenv:Envelope>
=======================================================

Ich hab noch die Hoffnung, dass man über diese Konfigurationsdatei irgendwie Username/Passwort für BasicAuthentification setzen kann, finds aber nicht.
Jedenfalls spielt client-config.wsdl auch eine Rolle für ssl-Konfiguration im axis-client
http://www.javamagazin.de/itr/online_artikel/psecom,id,481,nodeid,11.html , s. Punkt 9.

client-config.wsdl erscheint mir wirklich schlecht dokumentiert.

Gruß Axel
Titel: Re: HELP:Webservices-> Swing Client als Webservices Consumer
Beitrag von: flaite am 29.01.06 - 14:43:28
Hi,

ich habs jetzt auf sourceforge.net, bekomme es aber als anonymous user über pserver nicht ausgecheckt.
Es ist jedenfalls schon da. Und als authentifizierter sourceforge-user kann ich da auch prima mit Eclipse über extssh auschecken, einschecken und mich selber verwirren.
Vielleicht lag es einfach an den berüchtigten sourceforge.net-lags
Vermutlich. Ich weiss es nicht.
Es geht jetzt auch als anonymous über pserver.

Btw sind meine Files in cvsroot nur Spaß. Weiss jemand wie ich das wieder weghauen kann  ???
Sonst werd ich mich da selber schlaumachen.
Entscheidend ist das Modul help_ws_swing

Im Web-Frontend des cvs ist es auch da.
http://cvs.sourceforge.net/viewcvs.py/javahelpgui/

Weitere Informationen werden folgen.
Wer mitmachen will, kann sich ja als Entwickler auf sourceforge anmelden. Ich geb sofort Editorenrechte
... aber keine commit sluts, ok?  (http://www.jroller.com/page/fate/?anchor=commit_sluts) ;D

Es ist Java5. Alle benutzten libraries (und eclipse-Projekt-settings) sind im cvs.
Wie gesagt, werde ich noch genauer beschreiben wie man das in Eclipse ausscheckt und zum Laufen bekommt.

Gruß Axel