Ein solcher Komfort ist beispielsweise das sortieren von Listen. In JavaScript ist dies nur auf Arrays von primitiven Typen möglich (Strings, Numers); wenn man dagegen (Java-)Listen von (Java-)Objekten hat, möchte man diese in der Regel nach spezifischen Merkmalen sortieren.
Mit JavaScript kommt man da nicht weit - die Java Collections API dagegen ist genau das richtige Werkzeug.
Unglücklicherweise muss man für die Collections-API ein Comparator-Objekt besitzen; dieses muss eine Instanz des Interfaces Comparator sein.
Die Frage lautet also: wie erzeuge ich in Rhino ein Objekt, das ein spezielles Interface erfüllt?
Die Lösung ist ausgesprochen elegant und einfach, und wird mit dem Rhino-JavaAdapter realisiert. Mit diesem kann man JavaScript Objekte zu JavaObjekte wrappen.
Das folgende Beispiel zeigt, wie man Query-Results nach dem Path sortiert. Das funktioniert natürlich prinzipiell auch mit allen anderen Objekten. In diesem Beispiel werden Bild-Dateien eines Ordners ausgelesen und sortiert:
var q = new Packages.com.cosmocode.cms.rep.Query();
q.setContentType( Packages.com.cosmocode.mimetype.MimeType.IMAGE ) ;
q.setRoot( slideshow.getParent() ) ;
q.setScope( Packages.com.cosmocode.cms.rep.Scope.SUB );
var slides = rep.search(repSession, q);
var notEmpty = slides.size() > 0;
if ( notEmpty ) {
// nach dateinamen sortieren
cmp = {
compare : function (a,b) {
return a.getPath().toString().compareTo(b.getPath().toString());
}
};
var iComparator = new JavaAdapter ( Packages.java.util.Comparator, cmp) ;
Packages.java.util.Collections.sort( slides, iComparator ) ;
}
Funktioniert prima!
Und zeigt, das auch Erweiterungen von Java-APIS sich mit Rhino realisieren lassen.