CosmoCode
  • Great software.

  • Bright people.

  • Happy customers!

CosmoCode GmbH
  • Start
  • Geschäftsfelder
  • Über uns
  • Referenzen
  • Blog
  • Open Source
←
Alle Blogposts
→

Collections.sort in Rhino

Wenn man eine Java API mit Rhino scripted (so wie man dies tagtäglich mit formel tut), möchte man natürlich auch den Komfort von Java dort haben, wo JavaScript zu ungelenk ist. 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.

Detlef Hüttemann, 04.04.2006 13:16

Wenn man eine Java API mit Rhino scripted (so wie man dies tagtäglich mit formel tut), möchte man natürlich auch den Komfort von Java dort haben, wo JavaScript zu ungelenk ist.

 

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.

Mehr zum Thema

  • Publizieren in Rhino
  • The return of flat formel
  • jsr223/javax.script experiences and problems
  • rhino again
  • Uncaught exceptions in scheduled tasks
  • ApacheCon Amsterdam 2009; first impressions
  • Intelligente Android REST Autocompletion
  • Maven - Java Project Management
  • Schwedenurlaub mit CosmoCode
  • autounboxing NullPointerException

Kontakt

Wir freuen uns sehr über Ihr Interesse!
Sie erreichen uns hier:

CosmoCode GmbH

Prenzlauer Allee 36G
10405 Berlin

Telefon: +49 30 814 50 40 70

Telefax: +49 30 2809 7093


mail: info@cosmocode.de

CosmoCode GmbH  
   

© CosmoCode 2021 | Impressum | Datenschutz | Cookies verwalten

Schließen
Deutsch Englisch
  • Jobs