{"id":38,"date":"2008-09-30T21:29:19","date_gmt":"2008-09-30T21:29:19","guid":{"rendered":"http:\/\/euve3303.vserver.de\/stefan\/blog\/?p=40"},"modified":"2011-12-16T19:28:51","modified_gmt":"2011-12-16T18:28:51","slug":"jboss-seam-mit-mondrian-olap","status":"publish","type":"post","link":"https:\/\/cogito-ergo-blog.de\/blog\/2008\/09\/30\/jboss-seam-mit-mondrian-olap\/","title":{"rendered":"JBoss Seam mit Mondrian OLAP"},"content":{"rendered":"<p>Der <a href=\"http:\/\/mondrian.pentaho.org\/\" target=\"_blank\">Mondrian <\/a>OLAP Server, der seit einer Weile zur Pentaho-Suite geh\u00f6rt, kann mit einer recht leistungsf\u00e4higen Implementierung von Data-Cubes und der <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms145514.aspx\" target=\"_blank\">MDX<\/a>-Abfragesprache aufwarten.<\/p>\n<p>Allerdings kommt die mitgelieferte Oberfl\u00e4che etwas altbacken daher. <a href=\"http:\/\/jpivot.sourceforge.net\/\" target=\"_blank\">JPivot <\/a>und auch das Charting machen f\u00fcr meine Begriffe nicht viel her. Auch die eingesetzte Web-Technologie ist eher von gestern: JSPs und Taglibs oder ein selten genutztes Web Framework <a href=\"http:\/\/jpivot.sourceforge.net\/wcf\/index.html\" target=\"_blank\">WCF<\/a>.<\/p>\n<p>Da wurde bei mir schnell der Wunsch wach, Mondrian in <a href=\"http:\/\/www.seamframework.org\/\" target=\"_blank\">JBoss SEAM<\/a> zu integrieren und die Chart evtl. mit <a href=\"http:\/\/teethgrinder.co.uk\/open-flash-chart\/\" target=\"_blank\">Open Flash Chart<\/a> etwas aufzupeppen.<\/p>\n<p>Der folgende Artikel zeigt den ersten Versuch, ein Anfang ist also gemacht.<\/p>\n<p><!--more--><\/p>\n<h2>Taglib gegen Components<\/h2>\n<p>Der erste Ansatz war die alte JSP-Taglib, die unter Faclets sowieso nicht zu nutzen w\u00e4re, gegen eine JSF-Componente einzutauschen. Im zweiten Schritt soll dann eine SEAM-Componente hinzu kommen.<\/p>\n<p>Die Mondrian Taglib besteht im Kern aus drei Klassen:<\/p>\n<ol>\n<li>QueryTag<\/li>\n<li>TransformTag<\/li>\n<li>ResultCache<\/li>\n<li>DOMBuilder<\/li>\n<\/ol>\n<p>1 und 2 sind echte JSP-Tags, das erstere nimmt die Query entgegen und das zweite rendert mit Hilfe von XSLT daraus HTML-Tabellen.<\/p>\n<p>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 \u00fcbergehen, aber im ersten Schritt habe ich ihn fast unver\u00e4ndert \u00fcbernommen.<\/p>\n<p>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\u00f6tigten Properties und \u00fcberschreibt zum Rendern der Ausgabe &#8220;encodeEnd&#8221;.<\/p>\n<p>Die Component (oder besser deren Type) registriert man in einer Facelets-Taglib &#8220;mondrian.taglib.xml&#8221; 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 &#8220;FACELETS.libraries&#8221; in der web.xml bekannt.<\/p>\n<h2>Test-Project mit SEAM<\/h2>\n<p>Als n\u00e4chstes setzt man mit &#8220;seam create-project&#8221; eine SEAM Project auf, f\u00fcgt wie oben beschrieben, die neue Componente ein und baut einen View, der die neue Componente instanziiert.<\/p>\n<p>Damit Mondrian funktioniert, muss man dem SEAM-Project noch einige Dependecies von Mondrian hinzuf\u00fcgen. Bei der von mir verwendeten Mondrian Version (siehe unten) sind dies:<\/p>\n<ul>\n<li>eigenbase-xom.jar<\/li>\n<li>eigenbase-res.jar<\/li>\n<li>eigenbase-properties.jar<\/li>\n<li>mondrian.jar<\/li>\n<li>olap4j.jar<\/li>\n<li>commons-dbcp-1.2.jar<\/li>\n<li>commons-pool-1.2.jar<\/li>\n<li>commons-vfs.jar<\/li>\n<li>commons-math-1.0.jar<\/li>\n<li>javacup.jar<\/li>\n<\/ul>\n<p>Diese tr\u00e4gt man zus\u00e4tzlich in die von seamgen erzeugte Datei &#8220;deployed-jars-ear.list&#8221; ein und kopiert sie nach &#8220;lib&#8221; im Projekt-Verzeichnis, so werden sie von SEAM beim Deployment automatisch ber\u00fccksichtig.<\/p>\n<p>Desweiteren muss der von Mondrian verwendete JDBC-Treiber auf dem Classpath verf\u00fcgbar sein. Dieser kann ggf. auf dem Container selber deployed werden (jboss\/lib).<\/p>\n<h2>Weitere Resourcen<\/h2>\n<p>Nun fehlt nur noch wenig bis zur ersten Abfrage:<\/p>\n<ol>\n<li>Mondrian ben\u00f6tigt 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\u00fccksichtigt wird, tr\u00e4gt man sie am besten in die build.xml ein.<\/li>\n<li>Das Mondrian-Modell (hier im Beispiel foodmart.xml) muss ebenfalls (am besten auch \u00fcber den Classpath) auffindbar sein. Gleiches Spiel wie eben.<\/li>\n<li>Der connectString zum Mondrian-Server muss als Context-Parameter in der web.xml eingetragen werden.<\/li>\n<li>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.<\/li>\n<\/ol>\n<p>Der Pfad zum Modell im ConnectString muss \u00fcbrigens mit &#8220;res:&#8221; beginnen, damit Mondrian, was das VFS von Apache Commons nutzt, die XML-Resource auch findet.<\/p>\n<h3>Versionen<\/h3>\n<p>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\u00e4chst hier zum Download.<\/p>\n<h3>Ausblick<\/h3>\n<p>Wie schon in der Einleitung geschrieben, reizt mich vor allen das <strong>Charting <\/strong>mit Open Flash Chart zu machen. Eine weitere Chart-Componente muss also her, die Ergebnisse aus Mondrian direkt als Chart rendern kann.<\/p>\n<p>Weiterhin ist nat\u00fcrlich die Resourcen-Verwaltung in dieser ersten Fassung nicht gerade SEAM-like, werde ich noch \u00e4ndern. Und schliesslich ist die Componente nat\u00fcrlich etwas sehr statisch. In SEAM im RichFaces w\u00fcnscht man sich ja was geAJAXtes wo der Drill-Down und das Pivoting nur so flutsch &#8230;<\/p>\n<p>Mal sehn wann das n\u00e4chste mal Zeit f\u00fcr sowas ist.<\/p>\n<p>Das <a href=\"http:\/\/www.stefan-rinke.de\/download\/seam_mondrian.zip\">Archiv <\/a>enth\u00e4lt ein komplettes Projekt (frisch mit seamgen erzeugt), erg\u00e4nzt um alles was in diesem Artikel erw\u00e4hnt ist. Wegen der Downloadgr\u00f6sse fehlen lediglich alle *.class, alle *.jar und alle *.dat Dateien von der Derby-DB.<\/p>\n<p align=\"baseline\">Wenn komplett gebaut und deployed ist, das sieht das ganze so aus:<a href=\"\/blog\/wp-content\/uploads\/seam_mondrian.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-10026\" title=\"seam_mondrian\" src=\"\/blog\/wp-content\/uploads\/seam_mondrian.png\" alt=\"\" width=\"630\" height=\"543\" srcset=\"https:\/\/cogito-ergo-blog.de\/blog\/wp-content\/uploads\/seam_mondrian.png 630w, https:\/\/cogito-ergo-blog.de\/blog\/wp-content\/uploads\/seam_mondrian-300x258.png 300w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>BTW: An dieser L\u00f6sung ist nichts SEAM-spezifisch, alles geht nat\u00fcrlich auch mit Plain-JSF. Da ich aber immer mit Facelets arbeite, habe ich keine JSP-Tag Unterst\u00fctzung vorgesehen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Mondrian OLAP Server, der seit einer Weile zur Pentaho-Suite geh\u00f6rt, kann mit einer recht leistungsf\u00e4higen Implementierung von Data-Cubes und der MDX-Abfragesprache aufwarten. Allerdings kommt die mitgelieferte Oberfl\u00e4che etwas altbacken daher. JPivot und auch das Charting machen f\u00fcr meine Begriffe &hellip; <a href=\"https:\/\/cogito-ergo-blog.de\/blog\/2008\/09\/30\/jboss-seam-mit-mondrian-olap\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"_links":{"self":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/38"}],"collection":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=38"}],"version-history":[{"count":2,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/38\/revisions"}],"predecessor-version":[{"id":10077,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/38\/revisions\/10077"}],"wp:attachment":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=38"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=38"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}