Will man als Teil von “foobar” jetzt Sonderzeichen mit ausgeben, muss man XML-, WiX-/MSI-, und CMD-Escaping kombinieren – oder man hält sich einfach eine Waffe an den Kopf, das geht schneller:
" gibt " aus, & ein & – so weit, so klar. Wenn man davon absieht, dass & eigentlich auch ein CMD-Steuerzeichen ist 🤷🏼♂️
^< gibt ein < aus, ^> ein > (man beachte die ^, via)
Mit dem mxmlc lassen sich “Link-Reports” erstellen; entfernt vergleichbar mit dem “Größenbericht” aus der Flash-IDE: Welche Klassen sind in meiner SWF enthalten, und wie viel Platz belegen sie. Die Compileroption dazu (in Ant-Schreibweise aus FDT):
1
-link-report=${basedir}/build/link-report.xml
Allerdings sind diese Linkreports schlecht lesbar. Ich möchte auf einen Blick sehen, welche Klasse der Grund dafür ist, dass mein SWF 2 MB statt 500 KB groß ist. Gut, dass es Theo Hultberg gibt: Der hat eine XSL geschrieben, um den Linkreport in eine verständliche Form zu bringen (hier der Blogeintrag und die lokale Kopie der XSL). Ant kann XSL von haus aus:
Apache kennt von haus aus nur Input Dialoge (korrigiert mich), und damit kann man natürlich “j”/”n”-Eingaben bauen (siehe Examples). Schöner ist aber ein richtiger Ja/Nein-Dialog, wie Javascripts confirm. Außerdem gibt es if/else nur mit Ant contrib, das nicht zwingend überall installiert ist. Bitte nennt mir eine schönere Lösung als die folgende, aber damit geht’s – Confirm-Dialoge und if/else-Verzweigung abhängig von der User-Eingabe:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<target name="_set URLs and ports"depends="use Proxy, setURLs, setURLsAndProxy">
Jetzt könnte man vermuten, dass CDATA hilft, oder HTML-Sonderzeichen, oder Escapen, oder oder oder. Alles falsch. Der Serializer ist so “klug”, dass er alles trimt optimiert und ersetzt, bis er wieder den ursprünglichen String findet, und der Bug zuschlägt. Das meine ich mit “hartnäckig 🙂
Einzige Lösung, die mir eingefallen ist (Verbesserungen werden gerne gesehen!):
PS: Das ist deshalb geringfügig weniger dirty, als es aussieht, weil spitze Klammern Teil des Suchstrings sind. Spitze nicht-escapte Klammern dürfen in (validen) XMLs nur Teil der Struktur sein, deshalb werden hier tatsächlich nur Knoteninhalte, die ausschließlich “[]” lauten, ersetzt.
PPS: Ein ähnliches Problem gibt es mit
1
<foobar>{}</foobar>
aus dem ein Object wird. Ich ersetze es deshalb einfach analog, siehe oben.
Laut Liferay-Wiki legt man im Classpath (dort ist es explizit ein Package …/com/my/portlets/p1/…) eine Datei “Language.properties”, plus für jede “foreign language” (=Locale) ein “Language_*.properties” (mit *=locale). Das kann ich so nicht bestätigen: Meine Dateien müssen direkt in classes liegen, also ohne Package. Andernfalls bekomme ich ein
java.util.MissingResourceException: Can’t find bundle for base name Language, locale de_DE
zugreifen. Groß-/Kleinschreibung oder der ClassLoader waren bei mir nicht das Problem. Vermutlich muss ich beim Laden das Package mit angeben… allerdings sagt das Wiki das so nicht, und ich bin gerade zu faul 🙂
Achtung: Prinzipiell gibt es eine Fallback-Datei, d.h. wenn ich eine Language.properties und eine Language_de.properties habe, ist Language.properties der Fallback. Aber: Der Fallback wird auf Basis des Locale-Defaults ausgewählt! Sprich: Für Language.properties und Language_de.properties ist auf deutschen Rechnern Language_de.properties der Fallback! Das zu vermeiden, bzw. das auf allen Rechnern einheitlich zu haben, schafft man mit einem
1
Locale.setDefault(Locale.ENGLISH);
Interessanterweise muss ich die Language.properties auch nicht in der portlet.xml angeben!? Das Wiki spricht von <supported-locale> und <resource-bundle>; bei mir geht es ohne. Vielleicht mache ich hier einfach noch was falsch. Anyway, kurz zum Aufbau der portlet.xml: Wer einen
14:05:30,735 ERROR [PortletLocalServiceImpl:704] com.liferay.portal.kernel.xml.DocumentException: Error on line 12 of document : cvc-complex-type.2.4.a: Invalid content was found starting with element ‘supported-locale’. One of ‘{…}’ is expected.
bekommt, der möge auf die Reihenfolge der Knoten achten – so einfach kann’s manchmal sein 🙂 Zum Beispiel muss <supported-locale> vor <resource-bundle> deklariert werden. Für mich funktioniert die Reihenfolge
Liefert das Attribut “myAttribute” des Unterknotens (nicht begrenzt auf direkte Kind-Knoten), dessen Attribut myID gleich “abc” ist. Man beachte: Den doppelten Punkt hinter “xml”, sowie den Sternchen-Selektor. Quelle, man beachte dort auch die unten verlinkten weiterführenden Artikel.