Der Mondrian OLAP Server, der seit einer Weile zur Pentaho-Suite gehört, kann mit einer recht leistungsfähigen Implementierung von Data-Cubes und der MDX-Abfragesprache aufwarten.
Allerdings kommt die mitgelieferte Oberfläche etwas altbacken daher. JPivot und auch das Charting machen für meine Begriffe nicht viel her. Auch die eingesetzte Web-Technologie ist eher von gestern: JSPs und Taglibs oder ein selten genutztes Web Framework WCF.
Da wurde bei mir schnell der Wunsch wach, Mondrian in JBoss SEAM zu integrieren und die Chart evtl. mit Open Flash Chart etwas aufzupeppen.
Der folgende Artikel zeigt den ersten Versuch, ein Anfang ist also gemacht.
Taglib gegen Components
Der erste Ansatz war die alte JSP-Taglib, die unter Faclets sowieso nicht zu nutzen wäre, gegen eine JSF-Componente einzutauschen. Im zweiten Schritt soll dann eine SEAM-Componente hinzu kommen.
Die Mondrian Taglib besteht im Kern aus drei Klassen:
- QueryTag
- TransformTag
- ResultCache
- DOMBuilder
1 und 2 sind echte JSP-Tags, das erstere nimmt die Query entgegen und das zweite rendert mit Hilfe von XSLT daraus HTML-Tabellen.
3 und 4 sind Hilfsklassen zur Resourcenverwaltung und zum Erzeugen eines DOM-Trees aus dem Qurey-Result. Der ResultCache sollte in der Form unter SEAM wohl gar nicht existieren, sondern in eine SEAM-Componente übergehen, aber im ersten Schritt habe ich ihn fast unverändert übernommen.
Neu zu bauen ist eine JSF UIComponent, die an Stelle der JSP-Tags die Anfrage entgegen nimmt und das Ergebnis darstellt. Hierzu leitet man die neue Componente von UIOutput ab, definiert die benötigten Properties und überschreibt zum Rendern der Ausgabe “encodeEnd”.
Die Component (oder besser deren Type) registriert man in einer Facelets-Taglib “mondrian.taglib.xml” und die Component-Class in der face-config.xml. Da die neue Facelets-Taglib nicht im META-INF eines Jars liegt, macht man sie Facelets explizit durch den Context-Parameter “FACELETS.libraries” in der web.xml bekannt.
Test-Project mit SEAM
Als nächstes setzt man mit “seam create-project” eine SEAM Project auf, fügt wie oben beschrieben, die neue Componente ein und baut einen View, der die neue Componente instanziiert.
Damit Mondrian funktioniert, muss man dem SEAM-Project noch einige Dependecies von Mondrian hinzufügen. Bei der von mir verwendeten Mondrian Version (siehe unten) sind dies:
- eigenbase-xom.jar
- eigenbase-res.jar
- eigenbase-properties.jar
- mondrian.jar
- olap4j.jar
- commons-dbcp-1.2.jar
- commons-pool-1.2.jar
- commons-vfs.jar
- commons-math-1.0.jar
- javacup.jar
Diese trägt man zusätzlich in die von seamgen erzeugte Datei “deployed-jars-ear.list” ein und kopiert sie nach “lib” im Projekt-Verzeichnis, so werden sie von SEAM beim Deployment automatisch berücksichtig.
Desweiteren muss der von Mondrian verwendete JDBC-Treiber auf dem Classpath verfügbar sein. Dieser kann ggf. auf dem Container selber deployed werden (jboss/lib).
Weitere Resourcen
Nun fehlt nur noch wenig bis zur ersten Abfrage:
- Mondrian benötigt eine Property-Datei mondrian.properties auf dem Classpath. Diese wird einfach aus dem Mondrian-Demo WAR kopiert und auf die Classpath-Root gelegt (neben seam.properties). Damit auch diese Datei beim Deployment berücksichtigt wird, trägt man sie am besten in die build.xml ein.
- Das Mondrian-Modell (hier im Beispiel foodmart.xml) muss ebenfalls (am besten auch über den Classpath) auffindbar sein. Gleiches Spiel wie eben.
- Der connectString zum Mondrian-Server muss als Context-Parameter in der web.xml eingetragen werden.
- Da die Componente (vorerst) wie das alte Tag ein XSL-Stylesheet verwendet, um das Ergebnis nach HTML zu wandeln, muss auch das Stylesheet als Classpath-Resource ladbar sein.
Der Pfad zum Modell im ConnectString muss übrigens mit “res:” beginnen, damit Mondrian, was das VFS von Apache Commons nutzt, die XML-Resource auch findet.
Versionen
Die Versionen, die genutzt habe, sind: JBoss 4.2.2.GA, Seam 2.0.2.SP1 und Mondrian-3.0.4.11371-embedded. Das komplette Projekt gibt demnächst hier zum Download.
Ausblick
Wie schon in der Einleitung geschrieben, reizt mich vor allen das Charting mit Open Flash Chart zu machen. Eine weitere Chart-Componente muss also her, die Ergebnisse aus Mondrian direkt als Chart rendern kann.
Weiterhin ist natürlich die Resourcen-Verwaltung in dieser ersten Fassung nicht gerade SEAM-like, werde ich noch ändern. Und schliesslich ist die Componente natürlich etwas sehr statisch. In SEAM im RichFaces wünscht man sich ja was geAJAXtes wo der Drill-Down und das Pivoting nur so flutsch …
Mal sehn wann das nächste mal Zeit für sowas ist.
Das Archiv enthält ein komplettes Projekt (frisch mit seamgen erzeugt), ergänzt um alles was in diesem Artikel erwähnt ist. Wegen der Downloadgrösse fehlen lediglich alle *.class, alle *.jar und alle *.dat Dateien von der Derby-DB.
Wenn komplett gebaut und deployed ist, das sieht das ganze so aus:
BTW: An dieser Lösung ist nichts SEAM-spezifisch, alles geht natürlich auch mit Plain-JSF. Da ich aber immer mit Facelets arbeite, habe ich keine JSP-Tag Unterstützung vorgesehen.
Eine Antwort auf JBoss Seam mit Mondrian OLAP