Archiv für die Kategorie 'java'

GWT setFocus() – Deferred Command

Freitag, 30. Oktober 2009

Ich hatte vor kurzem im heiß geliebten IE6 das Problem, dass das Setzen des Focus auf eine TextBox mittels der Methode “setFocus()” keine Auswirkung hatte. Im Firefox hingegen hat es auf Anhieb geklappt. Nach kurzem rumprobieren hab ich es mit Hilfe eines sogenannten “Deferred Commands” – durch die Klasse DeferredCommand – gelöst. Damit ist es möglich, ein Quellcode-Abschnitt, welcher in einem Command gekapselt wird (siehe Entwurfsmuster Command Pattern), ausserhalb des aktuellen Kontextes NACH allen Handlern auszuführen. Die Umsetzung sieht dann wie folgt aus:

 DeferredCommand.add(new Command() {
      public void execute() {
        myTextbox.setFocus(true);
      }
    });

Und siehe da… wenn der Focus erst ganz zum Schluss des aktuellen Call-Stacks ausgeführt wird, klappts auch mit dem IE6 !

Variable Parameteranzahl in Java5 mit “…”

Samstag, 08. August 2009

Wer von der PHP-Ecke kommt kennt die manchmal sehr nützliche Methode “func_get_args()”, bei der man alle Methodenparameter in einem Array geliefert bekommt. Dies ist an denjenigen Stellen sehr praktisch, bei denen die Parameteranzahl nicht immer “fix” ist. Man kann das zwar auch durch ein Array lösen, jedoch ist die Syntax ohne Array weniger Overhead und somit einfacher zu lesen.

Zu meinem Erstaunen hab ich durch die Benutzung von EasyMock herausgefunden, dass es auch in Java 5 die Möglichkeit gibt die Parameteranzahl variabel zu halten. Dazu wird einfach das Token “…” hinter den Datentyp geschrieben, und Java wandelt es dann intern in eine Array um. Innerhalb der Methoden kann der Parameter dann als ganz normales Array behandelt werden. Folgendes Beispiel soll das ganze kurz demonstrieren.

public class MyTestClass{
  public static String concat(String... tokens){
    StringBuffer sb = new StringBuffer();
    for(String token : tokens){
      sb.append(token);  
    }
    return sb.toString();
  }
}

Durch die “…” kann die Methode nun wie folgt aufgerufen werden.

String result = MyTestClass.concat("foo", "bar", "blub");
System.out.println(result); // Ausgabe: foobarblub

Wie zu sehen ist kann man beliebig viele Strings in der Parameterliste angeben. In meinen Augen sehr schön zu lesen und findet mit Sicherheit an der ein oder anderen Stelle Verwendung ;)

Einen guten detailierteren Blog-Beitrag zur variablen Parameteranzahl in Java 5 Thema hab ich noch hier gefunden.

Java und die Klasse “Void”

Samstag, 18. Juli 2009

Zur Erstellung einer Übersichtsseite einer REST-like WebService-Schnittstelle musste ich per Reflections mehrere Klassen analysieren. Dabei musste ich auch den Rückgabewert einer Methode ausgeben, an den man wie folgt gelangt:

Class returnType = method.getReturnType();

Dabei bin ich davon ausgegangen, dass bei Methoden, welche keinen Rückgabewert haben, null zurückgegeben wird. Jedoch habe ich mich darin getäuscht. Denn statt null wird wird ein Objekt der Klasse “void” zurückgeliefert. In der Java API Doc steht zur Klasse folgende Beschreibung:

The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void.

Wurde bis jetzt noch nicht schlau daraus warum es die Platzhalter-Klasse “Void” gibt… naja ich gebs halt einfach mal aus. ;)

GWT 1.7 released – Bugfixing, Safari 4, Firefox 3.5, IE 8

Dienstag, 14. Juli 2009

Wie ich gerade auf der GWT-Homepage entdeckt habe, wurde GWT 1.7 released. Das Release enthält hauptsächlich kritische Bugfixes und stellt die Kompatibilität zu IE 8, FF 3.5 und Safari 4 sicher.
Was mich jedoch besonders freut ist, dass mein gemeldeter Bug im Zuge der Version 1.7 gefixt wurde. Und das bei lediglich 8 Bug-Fixes… yiiiha ;)

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!

Willkommen auf Java-Stage!

Freitag, 17. April 2009

Parallel zu meinem PHP-Pendant php-stage.de beschäftigt sich dieser Blog run um das Thema Java, mit dem ich mich zurzeit intensiv geschäftlich beschäftige. Ziel dabei ist es, wie auch bei php-stage.de, einerseits mir selbst ein Nachschlagewerk zu erstellen, und andererseits meine Kenntnisse und Erfahrungen zu verbreiten.

Momentan treibe ich mich speziell in folgenden Bereichen rum:

  • GWT 1.6 – Google Web Toolkit
  • Spring 2.5 (core, mvc, aop)
  • Hibernate 3
  • Java SE + Java EE 1.5
  • Allgemeine Software-Entwicklung

Ihr könnt in nächster Zeit also mit interessanten Artikeln speziell zu diesen Themen rechnen.

So, stay tuned!