Gedanken zu EJB3, meiner Welt und Diagrammen

Hello world!
Nachdem ich mit Gerald am vergangen Freitag Abend mich ein wenig ausgetauscht habe und wir über die unsere Ansätze in der Erstellung einer EJB3 JEE Anwendung gesprochen hatten, kamen mir doch schon ein wenig Zweifel, ob denn meine Anwendung nun vollständig rechtfertigt, ein EJB im Titel meiner Arbeit zu führen :-).
Nachdem ich mir dann noch ein mal das Buch über EJB2 und JPA (in dem leider die Konzentration arg auf JPA liegt) zur Brust genommen habe (kann man das bei Büchern so sagen?). Und auch noch mal die EJB3 Specs von Sun (das war übrigens mal JSR220) sowie eine recht gute Zusammenfassung und ein paar Tutorials (u.a. dieses hierangesehen habe, bin ich der Meinung, dass meine bisherigen Bemühungen definitiv in die richtige Richtung gingen (ist doch auch mal schön sowas).
Noch dazu weiß ich nun, dass ich JPA mit Annotation und einer Stateless Session Bean benutzen möchte. (Das Stateless resultiert einzig und alleine aus dem REST Ansatz). Dementsprechend kam mir die Idee, in meiner Arbeit auch definitiv ein paar Sequenzdiagramme benutzen möchte – da Zustandsdiagramme mir – zumindest momentan – eher witzlos erscheinen.
Als weiteren Punkt habe ich aus dem Treffen mitgenommen (sind heute irgendwie lauter Ratgeber-Formulierungen), mir endlich mal eine Gesamtübersicht über meine Funktionen zu erstellen. Da zu einem ordentlichen UseCase auch eine Beschreibung gehört (so habe ich es zumindest gelernt), poste ist jetzt hier erstmal zwei Diagramme unter Vorbehalt (der Beschreibungsteil ist noch in Arbeit und das Packet geht dann alsbald auf Tour, ganz ehrlich Phillip).
Ich habe mich dafür entschieden, jeweils zwei Diagramme, jeweils für den Bereich Aufgaben und für den Bereich Benutzer(-verwaltung) zu erstellen:

  1. Benutzer UseCase(s)

  2. Aufgaben UseCase(s)

Wie schon erwähnt: Die Beschreibungen der einzelnen Cases ist zum größten Teil fertig, da mit aber bis grad noch Dinge einfielen, die noch nicht durch die existierenden UseCases abgedeckt sind, möchte ich noch mal mindestens eine Nacht drüber schlafen. Auch ob ich nicht doch die Möglichkeit für verschiedene Benutzergruppen einbauen möchte schwebt mir noch im Kopf herum. Es wäre im Moment noch eine kleinere Änderung in der Datenbank und würde am Code bisher noch nicht wirkliche viele Umbauten nötig machen.


Offtopic:
Meinen Router habe ich jetzt mal bei Ebay rein gesetzt. Mal schaun was da so rauskommt.
Weiterhin habe ich mich mal mit dem Programm Flock vertraut gemacht. Das basiert auf der Firefox Engine und ist perfekt geeignet, wenn man Dinge bloggen möchte, wenn man Feeds vernüftig lesen will (und interessanten daraus bloggen will) und um Bilder von FlickR oder Videos von Youtube sehen möchte (und interessanten daraus bloggen will ^^). Weil irgendwie stehe ich mit dem Editor hier noch auf Kriegsfuß. Das Programm ist recht gut, funktioniert auch tadellos mit meinem – privaten – WordPress-basiertem Blog, hat allerdings so seine Probleme mit MovableType wie es scheint. Ich bilde mir zwar ein, dass die RPC Schnittstelle richtig ist, aber laufen wills dennoch nicht. Vielleicht nutzt das ja jemand auch und hat es geschafft, Flock zu überreden, auf dieser Blog-Software auch tätig zu werden :-).

[PP] ProblemPost

Soooo da das ja bei den Benutzern schon so wunderbar klappt, hier dann mal meine Probleme:
Wie in einem der letzten Posts erwähnt, möchte ich gerne eine Abhängigkeit meiner Entries untereinander haben. Das heißt, ich möchte unter einem Eintrag n Untereinträge haben. Das Klassendiagramm schaut dann so aus:

Meine Tabelle sieht so aus:

Ja eigentlich recht simpel. Nun bietet JPA im Rahmen von Annotation genau eine solche OneToMany Beziehung an.

@OneToMany(cascade=CascadeType.REMOVE)
private List _child_entries = new Vector();

In dieser Liste würden dann alle Kinder des Eintrages stehen.
Da ich mal einfach annehme, dass es unnötig ist, auf DB Ebene noch Foreign Keys zu erstellen, hoffe ich einfach mal, dass das so laufen wird.
Weiterhin habe ich eine Relations Tabelle, die mir die Benutzter mit den Einträgen verbindet und auch sicherstellt, dass n Benutzer für einen Eintrag zuständig sein können:

Hier beginnt es nun problematisch zu werden.
Okay es gibt in dem EJB Buch eine Beschreibung wie man ManyToMany Beziehungen modelliert, allerdings habe ich hier ja auch ein Attribut “status”, welches ja an sich nichts mit der Relation zu tun hat, allerdings schon logisch von dieser Abhängt.
Es würde sich meiner Meinung nach anbieten, dieses als seperates Objekt zu machen.
Ich habe mir das erstmal durch Netbeans generieren lassen. Es ist nun zugegebenermaßen etwas sperrig (weil Netbeans eine eigene PrimaryKey Class drum generieren will, damit sichergestellt ist, dass bei Neuerstellung alle notwendigen Schlüssel belegt sind), allerdings denke ich, dass es eine hinreichende Funktionalität bietet, um erst einmal weiter zu arbeiten.
Kommen wir nun zum Highlight :-/.
Es geht darum, dass die JDBC Anbindung von MySQL seltsamerweise Schwierigkeiten mit Daten zu haben scheint. Siehe dazu auch MySQL Bug #19274.
Ich werde jetzt mal versuchen, eine aktuelle Version zu installieren, die das Problem nicht mehr haben soll. Es geht halt nur darum, dass MySQL mit leeren Datumsangaben (ala 0000-00-00 00:00:00) nichts anfangen kann und eine exception wirft. Das ist in sofern ja nicht schlimm, als das ich einfach einen Eintrag erstellt habe und dann mal hoffe, dass ich damit den Fehler vermeide.
Ich fand weiterhin eine interessante Übersicht, wie JDBC die DB Attribute nach Java überführt:


aus Sun Java System Application Server 9.1 Developer’s Guide

Zu guter Letzte suche ich eine Möglichkeit, um einen klassischen HTTP Redirect (Status 303/301 usw.) Mit der Jersey Umgebung hin bekomme. Es gibt dazu sogar eine Diskussion in dem Blog von Angry Bill unter JSR 311, JAX-RS: Comment and suggestions. Ich fände eine Lösung mit einer @Location Annotation sehr gut. Bisher fand ich nur folgende Lösung, welche ich aber bisher noch nicht ausgiebig testen konnte:
Philosophical content negotiation aus dem Blog von Paul Sandoz (da steht jede Menge zu REST und JSR311 drin)
Abschließend noch eine Bemerkung zu der letzten Diskussion über die Queries.
Im REST-Test von Sun werden u.a. die Pagination-Settings an die URL angehängt also gibt es dann in etwas folgendes als Aufruf:

Request: GET http://localhost:8080/cotodo/resources/users/start=0&max=10&timestamp=1196991596495

Irgendwie schaut das schon wesentlich unübersichtlicher aus. Aber letztendlich muss ich mich eh noch damit befassen, wie ich die Parameter aus der URI extrahiere. Da ich nicht annehme, dass sich die beiden Möglichkeiten großartig unterscheiden werden, kann man sich ja direkt gleich mit der richtigen Lösung befassen.
Ein Problem was ich sehe, ist allerdings die Eindeutigkeit der Parameter, weil diese ja bei steigender Anzahl einen größeren Teil der URI bilden dürften.
Letztendlich ist es aber das gleich Problem wie bei allen Methodenaufrufen, bei denen man anhand eines Aufrufes auch nicht ohne weiteres sagen kann, wofür welcher Wert nun wirklich steht.

Resource User

Ich bin mittlerweile soweit, dass mir ein
Request: GET http://localhost:8080/cotodo/resources/users
eine Liste ala

<users>
    <user>3</user>
    <user>52</user>
    <user>53</user>
</user>

zurück gibt.
Das gleiche ist auch als JSON Format möglich.
Ein Post von
Test31testtest
wird mit einem status 200 (okay) quittiert.
Der erstellte User sieht dann so aus:

<user>
    <name>Test31</name>
    <hash>5a671c66aefea124cc08b76ea6d30bb</hash>
    <id>54</id>
</user>

(Die ID wird automatisch generiert, das Passwort wird im User Objekt per md5 gehashed)
Soweit die guten Nachrichten… alle meine aktuellen Probleme kommen gleich 🙁

kurzes Statement

Jetzt wo es an die Listen geht:
ist so etwas REST konform?

http://localhost/users?q=sonne

Immerhin müsste ein Listenabruf ja per GET erfolgen, also kann man die query nicht per POST übermitteln.


Was anderes am Rande:
ich bin in der seltsamen Situation, einen Draytek Vigor 2930 VS hier zu haben und ihn nicht zu brauchen…. Was der alles kann (außer Wlan – das was ich eigentlich brauche) steht auf der Produktseite bei Draytek.. Ich wollte mal fragen ob den jemand haben will. Im Moment liegt der Preis bei so 300 EUR. Wenn nicht, dann stelle ich den einfach bei Ebay rein :-).

users REST

GET http://localhost:8080/cotodo/users

gibt mir:

Weiterhin habe ich mir eine kleine Testanwendung geschrieben. Im Moment arbeite ich noch daran, per ajax meine GET/POST/PUT/DELETEs abzusetzen.

Als nächstes werde ich mich jetzt den unterschiedlichen Ausgabeformaten zuwenden und der Behandlung von POST/PUT Inputs

letzter Stand

Nachdem ich nun meine JRA jar habe und auch die restlet jar habe (Ich denke mir einfach mal, dass die vorausgesetzt wird).
Habe ich mir nun eine einfache Klasse geschrieben (okay sie ist geklaut, aber ich will ja erstmal testen, wie was geht ^^):

package de.hausswolff.cotodo.test;
import java.util.List;
import org.codehaus.jra.*;
@HttpResource(location="/customers")
public class Customers {
    private List registry;

    public Customers(){
        this.registry.add(new Customer("bob"));
        this.registry.add(new Customer("alice"));
        this.registry.add(new Customer("carol"));
        this.registry.add(new Customer("dave"));
    }
   
    @Get
    List get(){
        return registry;
    }

    @Post
    void add(Customer customer){
    }
}

Okay… die Klasse wird anstandslos kompiliert und auch Eclipse kennt alle Annotation (dient wahrscheinlich nur zu meiner Beruhigung, sagt es mir doch, dass die jar richtig eingebunden ist 😀 ).
Was ich mich jetzt allerdings frage ist, wie ich das schöne Teil nun einbinde.
Da es ja von Aufbau her nicht wirkliche eine Bean ist.
Ich habe versuchsweise in der web.xml folgendes eingefügt:

<servlet>
    <servlet-name>JRACustomers</servlet-name>
    <servlet-class>de.hausswolff.cotodo.test.Customers</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>JRACustomers</servlet-name>
    <url-pattern>/customers*</url-pattern>
</servlet-mapping>

Allerdings half das auch nicht. Unter /customers ist nix :-(. Ich werde mich damit morgen in aller Ruhe noch mal befassen.
Als weiter Möglichkeit, dachte ich mir, dass ich die Class per jsp useBean Tag einbinden kann, aber ist ja auch keine wirkliche Bean. Ich hoffe, dass ich da morgen weiter mit komme. Im Netz fand sich bisher auch nix. Und auf der JRA Page wird nur nach paranamer verwiesen. Was das nun schon wieder ist, werd ich mir morgen/gleich mal anlesen.

hands-on: Maven(2)

Bevor ich dann endlich mal wieder etwas über meine eigentliche Arbeit poste, noch mal ein kleiner Abstecher zu dem Thema “Dinge die man nebenher sich aneignet”.
Ich habe mich mal, nach dem Kommentar von Stefan bezüglich JRA umgesehen.
Leider fand ich zuerst nur eine Source Version vom JRA Code, sodass ich mir erstmal die Fähigkeit aneignen musste, das ganze zu kompilieren.
Als Build Tool kommt hier übrigens Maven 2 zum Einsatz.
Das ganze ist vom Apache Projekt und soll wohl irgendwann einmal die Nachfolge von Ant antreten. Wenn man sich so die Feature PlugIns Liste ansieht, ist das auch durchaus wahrscheinlich.
Der riesen Vorteil von Maven 2 – soweit ich das bisher verstanden habe – ist, dass man die Tools, welche man zum Erstellen/Installieren/Testen/Deployen benutzen will, nicht vorher installieren muss, sondern dass Maven 2 von der Versionierung der Sourcen bis hin zum letztendlichen Kopieren auf das Zielsystem alles übernimmt.
Um es kurz zu machen: Ich erhielt dann nach viel Installation und Tutorials lesen endlich meine jra-1.0-alpha-5-SNAPSHOT.jar 🙂 .

Nachdem ich dann noch mal auf der JRA Homepage gesucht habe, habe ich allerdings gesehen, dass es eine alpha 4 auch zum Download gibt. Nunja bin ich zumindest ein wenig aktueller. Jetzt will ich mal schaun, dass ich die Jar einbinden und mit meinem bisherigen Projekt zum Laufen kriege.

Kontakte konsolidieren Teil 1

Ich betreibe schon seit einiger Zeit eine “Konsolidierung” meiner sämtlichen Kontakte.  So habe ich nur noch eine Stelle (das Apple Adressbuch) an der ich Einträge erstellen/aktualisieren muss und habe sie dann zum Beispiel auf meinem Handy (ein Nokia N80).

Mit MacOS 10.5 ist eine neue – wie ich finde schöne – Funktion hinzugekommen:

Unter  Adressbuch->Einstellungen->Allgemein ist im unteren Bereich ein Button, mit dem man eine Synchronisation mit dem Yahoo Adressbuch einstellen kann. Da ich aufgrund von (seltenen, aber durchaus vorhandenen) Uploads zu FLICKR eh einen Yahoo Account besitze, und damit Email und Adressbuch habe, hat es sich quasi aufgedrängt, das mal zu testen. Und ich muss sagen, es funktioniert (apple-like) problemlos und im Hintergrund.

Als ich dann bei XING gestern dann noch eine Funktion fand um mein Yahoo Adressbuch mit angemeldeten und mit mir verbundenen Kontakten abzugleichen, schloss sich wieder ein Kreis :-).

Meine Kontakte dann über das Yahoo Adressbuch auf einen anderen Mac zu importieren habe ich noch nicht versucht, aber ich denke das sollte problemlos möglich sein. Alles in allem eine nette Funktion mit Mehrwert. 

REST resources

Hier dann mal eine Übersicht, wie ich REST auf meine Anwendung hin abbilden möchte:

Das deckt sich auch ungefähr mit meinen Use-Cases. Ich werde jetzt versuchen eine Java Bean mit REST Funktionalität anzulegen um damit dann mein JPA Objekt zu bearbeiten :-).
Weiterhin muss ich mir noch stark überlegen, ob ich dann überhaupt noch JSP für die Darstellung brauche, oder ich nicht alles über Beans machen kann. (Wobei ich eigentlich gerne für die Display Logic – also die reine “Verpackung” bei JSP bleiben würde). Ich denke ich werde als Ausgabeformat der Resourcen(listen) ersteinmal bei XML bleiben, wobei sich als User natürlich auch anbieten würde, auch VCard anzubieten (aber ich muss ja in meinem Bereich bleiben 🙂 )