Java: Dynamischer Rückgabewert

Ich wollte sinngemäß etwas wie ArrayList.toArray(T[]) bauen, also eine Methode, die ihren eigenen Rückgabe-Typ zur Laufzeit übergeben bekommt. Die Lösung ist einfach, wenn man weiß wie:

Die Reihenfolge und genaue Notation von Generics in Methoden kann ich mir nicht merken. Egal, aufzurufen mit

Velocity: EscapeTool einrichten und verwenden

UTF8-kodierte, getrimmte Ausgaben sind ja gut und schön, aber evt. möchte man diese auch escapen 🙂 Dazu gibt es das EscapeTool. Das ist ganz cool, bietet es doch Tools für HTML, URLs, JS, ... Die "Doku" ist allerdings ein wenig dürftig, deshalb kurz dazu:

Den Download findet man hier. Ich habe die velocity-tools-2.0.zip genommen; daraus benötigt man aber nur lib/velocity-tools-2.0.jar. Das kommt in den Classpath, klar.

Aktivieren und in Templates injizieren (oder wie das da heißt) tut man das so:

Und verwendet schließlich so:

Dabei ist das "!" in "$!{esc" wichtig, denn wenn $myString null ist, wird html() nicht gefunden – html() ist für String-Parameter definiert, nicht für null^^

Validation in Eclipse [UPDATE]

Wer JS-Error angezeigt bekommt, obwohl er schon sämtliche Validatoren deaktiviert hat, der gehe zu

Projekt Einstellungen -> JavaScript -> Include Path -> Source

und gebe unter "Included" ein "_" ein (einfach damit da was steht), unter "Exluded" gebe man ".*" an (quasi via).

Ein

invalid content was found starting with element...

für WSDLs löst man angeblich mit dem Entfernen des Häkchens unter

Eclipse Einstellungen -> XML -> XML Files -> Validation -> Honour all XML schema locations

...bei mir hat das geholfen, allerdings kommen die Fehler auch nicht zurück, wenn ich das Häkchen wieder setze. Eclipse halt. Und: Ja, ich finde es auch komisch, dass hier offenbar XMLs und WSDLs vermischt werden 🙂

Build-File- (Ant-) Probleme lassen sich über

Einstellungen -> Ant -> Editor -> Problems

justieren

Ein

Errors occurred during the build.
Errors running builder 'JavaScript Validator' on project 'some-project'.
java.lang.NullPointerException

lässt sich in Project->Properties->Builders unter "Javascript Validator" deaktivieren.

tbc

Probleme mit dem Tomcat in eclipse

Wer eine java.io.EOFException ("IOException while loading persisted sessions ") bekommt, der möge alles in

"your workspace"/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work

löschen (via) – manchmal ist "work" auf in "tmp1", ... zu finden.

Wessen Tomcat ein "May be locked by another process" bekommt, der möge

"your workspace"/.metadata/.lock

löschen. Was man tun kann, wenn das trotzdem bei jedem Neustart wieder auftritt, weiß ich auch nicht.

Wann hat eclipse eigentlich angefangen, nicht mehr zu funktionieren?

Velocity: Vorsicht beim trimmen des Outputs

Velocity ist eine tolle Sache. Viel toller als der Internet Explorer jedenfalls. Der IE < 9 beispielsweise crasht, wenn ein Ajax-Response zu groß ist. Zugegeben: Der fragliche Response war auch wirklich groß, so 6 MB oder mehr. Er besteht aber zum Glück größtenteils aus Whitespaces, die daraus resultierten, dass zig Velocity-Templates (jedes mit zig Schleifen) zusammengemerged wurden - und Velocity erhält Whitespace. Man könnte "einfach" alle Whitespaces aus den Templates nehmen, und hätte vermutlich viel gewonnen. Allerdings könnte dann niemand mehr die Templates warten (weil lesen), und das wäre wiederrum nicht so toll.

Deshalb die Idee, den Velocity-Output zu "säubern" (zu trimmen, zu stripen, ...). Gesagt getan: Eine Funktion, die die entsprechenden Chars löscht, könnte beispielsweise so aussehen:

Die Rekursion ist deshalb nötig, weil ␣␣␣␣ sonst nur zu ␣␣ statt zu ␣ werden.

Das funktionert auch ganz gut. Blöd, wenn man ein SAP hinter seiner Webseite hat, denn SAP kennt IDs, die zum Beispiel so aussehen: "01101NA50021435513400011␣␣2012081499991231␣␣␣␣␣␣␣␣␣␣000". Die stehen bei uns in data-Attributen, und müssen so erhalten bleiben. Deshalb musste eine Lösung her, die Whitespaces filtert, aber NICHT in data-Attributen (genauer gesagt heißen die Attribute data-entry-json).

Die Velocity-Jungs empfehlen für das "Whitespace Gobbling" JTidy, aber das funktioniert nicht (out of the box); die Whitespaces in data-entry-json-Attributen bleiben erhalten.

Besser ist der HtmlCompressor, der das zwar auch nicht out of the box kann, der aber die Möglichkeit bietet, eigene Patterns zu definieren, die erhalten bleiben sollen. Laut Doku ist das für bestimmte Tags, aber man kann auch freiere Patterns angeben:

Das obige Pattern sucht nach Tags, die "data-entry-json" enthalten, und sagt dem HtmlCompressor, diese Tags zu erhalten.