Saturday, 15 December 2012

GWT: SuggestBox in einer CellTable

GWT 2.5

Hat man sich einmal entschlossen eine CellTable zu verwenden und stößt dann auf Anforderungen die die CellTable nicht von vornherein vorgesehen hat kann das sehr ärgerlich werden. Mir ging es so bei der Anforderung eine SuggestBox in der Table zu verwenden.
Schlußendlich stellte sich heraus daß das Ganze gar nicht so eine Zauberei ist, muß aber auch dazusagen, daß die Lösung noch nicht wirklich den Praxistest erlebt hat.

Meine Lösung besteht darin, einfach die TextInputCell zu extenden und so eine SuggestBox reinzuschummeln:


public class SuggestBoxTextInputCell extends TextInputCell {

 MySuggestBox suggestBox;

 private class MyTextBox extends TextBox {
  public MyTextBox(Element element) {
   super(element);
  }
 }

 private class MySuggestBox extends SuggestBox {
  public MySuggestBox(SuggestOracle suggestOracle, TextBox textBox) {
   super(suggestOracle, textBox);
  }

  @Override
  public void onAttach() {
   super.onAttach();
  }
 }

 public SuggestBoxTextInputCell() {
  super();
 }


 @Override
 public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event,
   ValueUpdater<String> valueUpdater) {
  super.onBrowserEvent(context, parent, value, event, valueUpdater);
  String eventType = event.getType();
  if (BrowserEvents.FOCUS.equals(eventType)) {
   TextBox textBox = new MyTextBox(getInputElement(parent));
   suggestBox = new MySuggestBox(getSuggestOracle(), textBox);
   suggestBox.onAttach();
  }
 }

 private SuggestOracle getSuggestOracle() {
        //this does not work without implementation
        return null;
 }
}

Die Methode gestSuggestOracle muss natürlich noch implementiert werden um den Beispielcode lauffähig zu bekommen.
Links:
Google Groups Beitrag
Stackoverflow Beitrag zum Thema

Thursday, 29 November 2012

JMeter Einschließende URL-Muster

JMeter 2.8

Zeichnet man mit dem JMeter HTTP Proxy Server einen Geschäftsfall auf liefert der Browser, bzw. oft dessen Plugin ziemliches Störfeuer.

Um das loszuwerden sind einschließende URL Muster hilfreich, damit wird viel von dem unnötigen Zeugs einfach nicht aufgezeichnet. Diese Muster sind leider nicht ganz einfach zu erraten, darum hier ein Screen:




Friday, 23 November 2012

Einbindung von Source eines Submoduls für GWT/Maven

GWT 2.5.0
gwt-maven-plugin 2.5.0
Maven 3.0.3

Bei einem mehrmoduligen GWT/Maven Projekts ist das Model oft in einem anderen Modul als im eigentlichen GWT Modul (web Modul). Für das gwt-maven-plugin werden auf der Homepage 2 Möglichkeiten vorgeschlagen das zu lösen:

http://mojo.codehaus.org/gwt-maven-plugin/user-guide/project.html

Erster Vorschlag das Goal gwt:resources hinzuzufügen funktioniert ausgezeichnet, allerdings möchte man das Problem manchmal nicht über zusätzliche Commandline Befehle lösen sondern über die pom Konfiguration. Hier wird vorgeschlagen das ganze über das Attribut compileSourcesArtifacts zu lösen, das funktioniert aus mir nicht ganz erklärlichen Gründen nicht.

Meine Lösung war dann genau wie vorgeschlagen das zusätzliche gwt.xml im Submodul anzulegen:


  
  


 und dieses im gwt.xml des GWT Moduls zu mit "inherits" einzubinden.


Damit funktioniert das Ganze leider noch nicht, im pom.xml des Moduls, wovon das Model eingebunden werden soll muß man noch folgendes eintragen:

 
  
   
    src/main/java
    
     **/*.java
    
   
   
    src/main/resources
    
     **/*.xml
    
   
  
 



Wednesday, 7 November 2012

Java: Deep Copy von Listen

Eine "tiefe" Kopie einer beliebigen Liste in Java ist gar nicht so selbstverständlich wie man meinen möchte, die meisten Ansätze kopieren nämlich zwar die Liste, aber der Inhalt bleibt Referenz und somit wird die Kopie nicht "tief".

Eine kleine Methode löst mir das Problem:

public static List<ResultLine> deepCopyListResultLine(List<ResultLine> list) {
  List<ResultLine> resList = new ArrayList<ResultLine>();
  for (ResultLine line : list) {
   resList.add(new ResultLine(line));
  }
  return resList;
 }


Voraussetzung ist natürlich dass das Objekt über einen Konstruktor verfügt der diese Art der Duplizierung möglich macht:

public class ResultLine implements Serializable {

 public ResultLine() {

 }

 public ResultLine(ResultLine line) {
  this.plz = line.getPlz();
  this.app = line.getApp();
  this.eighty = line.getEighty();
  this.eightyAnz = line.getEightyAnz();
  this.firstTen = line.getFirstTen();
  this.firstTenAnz = line.getLastTenAnz();
  this.lastTen = line.getLastTen();
  this.lastTenAnz = line.getLastTenAnz();
  this.ldkz = line.getLdkz();
  this.makler = line.isMakler();
  this.mobile = line.isMobile();
  this.sessionAnz = line.getSessionAnz();
 }

Auf diese Weise ist ein "tiefes" Kopieren kein Problem mehr.

Tuesday, 18 September 2012

GWT: *.nocache.js wird nicht gefunden

Ecplise: Indigo Service Release 2
Maven 3.0.3
Google Plugin 3.1.0
GWT SDK 2.4.0
m2e Plugin 1.0.200


Wird beim Start der Applikation das nocache.js File nicht gefunden kann das einige Gründe haben, bei mir war das Problem die Umbenennung des ganzen Projekts. Im Web Deployment Assembly des Web Moduls wurde diese Namensänderung nicht automatisch nachgezogen und so wurde natürlich das nocache.js File nicht gefunden. 

Weg zur Einstellung: Web Modul -> Rechtsklick -> Properties -> Deployment Assembly (Dort fügt man die entsprechenden Folder hinzu).