Archiv für Juni, 2009

GWT 1.6.4 – Timestamp.valueOf()

Montag, 22. Juni 2009

So wie es aussieht wurde ganz schön gepfuscht bei der Emulierung der paar Klassen im java.sql Package ;)

Nach dem von mir vor kurzem berichteten Bug  in der Date.valueOf()-Methode, bin ich nun auf ein abweichendes Verhalten bzw. Bug in der emulierten Timestamp.valueOf()-Methode (auch wieder im java.sql-Package) gestoßen. Denn bei einem String wie bspw. 2009-12-01 10:10:58.11 kann nicht einfach so wie vermutet, und wie es auch in JRE der Fall ist, ein Timestamp-Objekte mittels Timestamp.valueOf() erzeugt werden. Denn die emulierte Timetsamp.valueOf() Methode schmeißt eine IllegalArgumentException, wenn nicht hagenau das Format yyyy-mm-dd hh:mm:ss.fffffffff eingehalten wird. D.h. die Nanosekunden müssen genau 9 Zeichen lang sein… argh. So wie ich das Gefühl habe wurden die Klassen im java.sql Package auf die schnelle noch emuliert… oder zumindest versucht :)

GWT 1.6.4 – IlegalArgumentException in Date.valueOf()

Montag, 15. Juni 2009

Ich arbeite jetzt schon mehrere Monate an einem GWT-Client als Aufsatz zu einer J2EE Anwendung. Dabei kommt nicht GWT-RPC zum Einsatz, welches sich ja das Marshalling bzw. Unmarshalling direkt mitbringt, sondern diese Aufgaben wurden selbst implementiert. Der Grund dafür ist die Unabhängigkeit einer nicht proprietären Lösung, welche nötig für weitere Clients war.

Anscheinend nutzen jedoch wohl die meisten GWT-RPC, denn ich bin auf einen üblen Bug in einer recht wichtigen Methode, nähmlich in Date.valueOf(), gestoßen. Es ist darin nicht möglich ein Date-Objekt anhand bspw. dem String 2009-08-10 zu erstellen. Das fieße dabei ist noch, das im Hosted mode alles funktioniert aber im Web Mode dann die große Überraschung kommt… IllegalArgumentException innerhalb Date.valueOf().

Nach näherem Durchwühlen des Sourcecodes der emulierten Date.valueOf()-Methode war der Grund schnell klar. Die Monate und Tage werden mittels der Methode Integer.decode() in einen Integer umgewandelt. Das interessante ist jedoch, das diese Methode bei Zahlen mit führenden Nullen von einer Oktalzahl ausgeht. Da es die 8 jedoch nicht im Oktalsystem gibt, fliegt eine unerwartete Exception. Die Lösung dafür ist vor dem Aufruf von Date.valueOf() die Nullen vor dem Tag und dem Monat entfernen.

Das schöne daran war jedoch die schnelle Reaktion von google nach Erstellen eines Tickets (http://code.google.com/p/google-web-toolkit/issues/detail?id=3731&q=date.valueof). Innerhalb von 2 Tagen wurde das Ticket validiert, als kritisch eingestuft und der Bug wird beim nächsten Release gefixt sein. Bin sehr begeistert der schnellen Reaktion!