Results for category "GWT"

10 Articles

Google Plugin for Eclipse / GWT 1.6

Google hat nun ein eigenes Plugin für Eclipse veröffentlicht. Von seiner Funktionalität entspricht es dem Googlipse-Plugin. Sollten wir für ein zukünftiges Projekt wieder GWT einsetzen, werde ich das Google Plugin antesten. Ein Key-Feature, was unbedingt für einen Wechsel von Googlipse zu Google Plugin sprechen würde, existiert meiner Meinung nach nicht.

Weiterhin wurde GWT 1.6 veröffentlicht. Durch interne Änderungen in den Verzeichnisstrukturen wird aber auch hier für unser ggw. Projekt vermutlich kein Release-Wechsel stattfinden. Eine kurze Übersicht über die Changes:

  • Änderung der Verzeichniskonventionen
  • Server-Code (RPC-Services) können nun ohne Debugger-Restart geändert werden
  • (Ecl)EMMA läuft nun mit GWT flüssiger
  • Auf Multi-Core-Maschinen wird nun die Kompilierung parallelisiert – für mich wäre das ein Grund, auf GWT 1.6 zu wechseln
  • Event Handling wird nun mit dem Handler-Pattern realisiert
  • DatePicker ist nun als Standard-Widget mit in der Distribution

Mehr zu den gefixten Fehler aus dem Release Candidate gibt es im Bugtracker des GWTs.

Akzeptanztests für das GWT mit Hilfe von Selenium

Selenium ist ein Sammlung von Tools, mit deren Hilfe sich Akzeptanztests definieren lassen. Selenium IDE kann zum automatischen Aufzeichnen von Aktionen benutzt werden. Dabei wird SI als Plugin im Browser installiert.
So weit, so gut – ich wollte nun für unsere GWT-Applikation Selenium einsetzen, da das manuelle Testen einiges an Zeit in Anspruch nimmt.
Das Warten auf die Antwort der AJAX-Aufrufe löste ich pragmatisch durch pause(). Die User-Extension waitForCondition ignorierte ich für AJAX-Aufrufe erst einmal.

Für mich enstand nun folgendes Problem: die einzelnen Elemente der TreeView (com.google.gwt.user.client.ui.Tree) ließen sich nicht anklicken.

  • SI zeichnete die Clicks nicht auf. Der Grund dafür liegt darin, dass das onClick-Event nicht auf Layer oder Labels an den Browser gefeuert wird.
  • Über die ID (gwt-uid-…) konnte ich den Click (click -> id=gwt-uid-…) laut IDE zwar durchführen, im Browser passierte aber nichts.
  • Eine manuelle Festlegung der ID im GWT (treeItem.ensureDebugId(“element”)) führte zum selben Ergebnis: im Browser passierte rein gar nichts.

Als Fazit kann ich leider nur sagen, dass die Idee hinter Selenium zwar richtig gut ist. Allerdings funktioniert das Zusammenspiel zwischen GWT und Selenium für unsere Zwecke überhaupt nicht. Dementsprechend: Back to the roots und von Hand testen 🙁

Bei meiner Recherche nach möglichen Workarounds bin ich übrigens über CubicTest gestoßen. CubicTest ist ein Eclipse-Plugin mit denen sich Testfälle in der Eclipse-IDE visuell modellieren lassen. Die Tests könne danach unter anderem als Selenium-Tests exportiert werden.

IT-iges

Wie ich gestern bereits andeutete, haben wir heute unser SAN bestellt: 1 * 3 HE Server von Thomas Krenn, 10 * 1 TByte SATA-Server-HDDs, 3 * NICs von Intel (jeweils 4-Gigabits-Ports pro Karte) und ein 48 Port-Switch.
Ende der Woche, Anfang nächster Woche werden wir unsere Infrastruktur dementsprechend umstellen.

Nachdem die Bestellung des SANs ‘rausging, habe ich mich mit dem GWT Designer herumgeschlagen. An sich ist das Tool ganz nett, allerdings gibt es ein Bug, der äußerst lästig ist: Ich habe für unser Projekt verschiedene abstrakte Basis-Klassen für bestimmte Widget-Typen (z.B. Historisierbare Objekte u.s.w.) – nun erbe ich in einem eigenen Widget von eben dieser abstrakten Klasse. Der GWT Designer ist nicht in der Lage, auf die, in der Child-Klasse definierten überschriebenen abstrakten Methoden zuzugreifen. Das hat zur Folge, dass unter anderem nicht alle Widgets (Labels, Textboxen etc) angezeigt werden.

Dann bin ich heute im Laufe des Abends über zwei interessante PHP-relevante Seiten gestoßen: Unter http://www.slideshare.net/mayflowergmbh/stateful-soap-webservices?src=embed gibt es eine Slideshow zum Thema Stateful SOAP Webservices, während es bei http://www.phpdoctrine.org/ einen OR-Mapper für PHP5 gibt.

Probleme mit dem GWT Designer

Marci und ich haben beim GWT-Designer folgende ominöse Fehlermeldung bekommen: “Designer error occured”. Die Stacktrace erzählte etwas von “Cannot convert object…” bzw. gab es eine IllegalArgumentException.

Die Lösung des Problems: in der .classpath-Datei des Projekts muss die gwt-user.jar am Anfang stehen.

Required argument 0 not present…

Testweise habe ich heute unsere Applikation von GWT 1.4.62 auf Milestone 2 des GWT 1.5 geupdatet und bekam nach dem Start der Development Shell den Fehler “Required argument 0 not present”.

Nachdem ich das Inteface GuiMessages gegen die GuiMessages.properties abgeglichen und keinen Fehler festgestellt hatte, untersuchte ich den String in der .properties genauer:

logAnmeldungErfolgreich=Benutzer '{0}' erfolgreich authentifiziert...

Den Fehler sieht man erst auf den zweiten Blick: Die Hochkommata müssen doppelt gesetzt werden, sonst interpretiert das GWT “{0}” so, wie es dort steht.
In der Dokumentation steht davon übrigens nichts… Richtig schaut es nun so aus:

logAnmeldungErfolgreich=Benutzer ''{0}'' erfolgreich authentifiziert...

Extreme Faulheit – Das DRY-Prinzip in Reinkultur

Meine Faulheit hat ein nicht mehr feierliches Maß angenommen: Ich habe gestern für eines unserer Projekte ein Meta-Tool in PHP geschrieben, das aus allen Java-TOs die zugehörigen Dateien erzeugt.
Mit zugehörigen Dateien meine ich damit: BOs, GWT-Service-Implentations, GWT-Service-Definitions, Model-Assemblers, sowie Einträge für web.xml und gwt.xml.
Trotz der Entwicklungszeit des Scripts von ca. 6h habe ich dadurch insgesamt knapp eine Woche an Entwicklungszeit für das Projekt an sich gespart.

Ich bin so faul 😉

GWT liefert leere Objekte zurück

Für mich war heute der erste Tag, an dem ich wieder an unserem GWT-Projekt gesessen habe. Nachdem ich viele Sachen verbessert habe (I18N mit Constants, Injizierung der Datenbankverbindung über die web.xml, Fixen von einigen Unit-Tests), machte ich mich an das Überprüfen der GWT-RPCs.
Lustigerweise funktionierte von jetzt auf gleich die Rückgabe der GWT-Servlets nicht. Es wurde z.B. ein Objekt vom Typ “BenutzerModel” zurückgegeben, allerdings waren die kompletten Eigenschaften wie “benutzername” leer bzw null.

Nachdem ich die Servlets durch-debuggt hatte, war ich nicht schlauer. Theoretisch hätten die Models gefüllt zurückgegeben werden müssen.
Ein paar Minuten später fiel mir dann ein, dass sowohl die Models das Marker-Interface IsSerializable implementieren, als auch einen leeren Defaultkonstruktor besitzen müssen. Danach funktionierte wieder alles. Was mich äußerst verwundert: Warum funktionierte das vorher? Ein Diff zwischen Trunk und einer bereits funktionierenden Version zeigte keine sonderlichen Unterschiede.

Eine Sache am GWT habe ich btw noch zu mäkeln: Anstatt dass beim Starten des GWT-Browsers die WebContent/WEB-INF/web.xml herangezogen wird, wird die tomcat/webapps/WEB-INF/web.xml benutzt.
Das ist eine Sache, die mich wahnsinnig nervt. Zumal nämlich die WebContent/WEB-INF/web.xml nicht automatisch ins tomcat-Verzeichnis kopiert wird.
Also heißt es, neue Servlets in beiden web.xml-Dateien manuell einzutragen.