Jasper und die verwunschenen Formatierungen – Ein kleines Entwicklermärchen

Lukas Urfer

Eine Geschichte voller Challenges, Emotionen und Mut! Wie Urfell und Jasper die Hürden der Formatierungen überwanden und wie sie sich zum Erfolg aufarbeiteten. All das erzählt uns Lukas in seinem kleinen Entwicklermärchen.

Es war einmal vor kurzer, genauer gesagt vor sehr kurzer Zeit, ein wagemutiger Entwickler bekannt unter dem Namen Urfell. Dieser wollte sich den Aufgaben des Applikationsverantwortlichen stellen, einen eher in die Jahre gekommenen PDF Report einer schönen, jungen und dynamischen HTML Ansicht anzugleichen. Diese war von solcher Schönheit, dass der ebenfalls nicht mehr allzu junge Mann sich bewusst war, einen steinigen Weg vor sich zu haben.

Zusammen mit seinem alten Bekannten Jasper machte er sich an die Arbeit. Als erstes mussten sich die beiden einen praktischen Arbeitsablauf ausdenken:

1. Ein effizienter Workflow

Mit dem Kopieren des alten Report Files und Verändern der Endung .xml nach .jasper wurde der Einsatz des grafischen Editors Jaspersoft® Studio zum Anpassen des Reports ermöglicht. Das Report File wurde direkt aus dem Intellij Workspace Folder geöffnet. Die App wurde als WAR File im JBoss in Intellij gestartet. Nach Anpassungen der Datasources im Code oder Änderungen im Report bedurfte es also lediglich eines Ctrl-F9, ein Neuladen der Ressourcen im JBoss und die Aktion PDF generieren in der App, damit das frisch gebackene PDF das Licht der Welt erblickte.

Urfell machte sich mit diesem Vorgehen ein wenig vertraut und bereits nach kurzer Zeit stand er vor der ersten richtigen Herausforderung:

2. Grow and Shrink

Datensätze wurden mithilfe von SubReports in Rows gerendert. Diese Rows mussten aber je nach Typ unterschiedlich dargestellt werden und teilweise grösser oder kleiner erscheinen. Urfell probierte mit diversen Elementen und Attributen das gewünschte Aussehen zu erzielen. Was immer klappte, war das vertikale Vergrössern. Sollte aber ein Element gar nicht dargestellt werden, nahm es immer eine Mindesthöhe ein und zerstörte das Layout. Unzählige Fluchwörter, Kaffees und Schweissausbrüche später kam Urfell auf die grandiose Idee, die verschiedenen Row Varianten in einzelne Detail-Bands zu verpacken und dann nur jenes darzustellen, das passte. Hier wurde mit der Print When Expression gearbeitet. Wieso war er nur nicht früher auf diese Idee gekommen?! Um dies visuell noch zu untermauern kam auf einmal Prinz „Screen“ geritten:

 

Frustriert, aber doch ein wenig erleichtert, suchte sich der erschöpfte Entwickler einen geeigneten Schlafplatz – in seinem Fall Zuhause genannt – und ruhte sich aus. Es warteten ja sicher noch andere Stolpersteine auf ihn. Jasper war schon ganz aufgeregt, als es am frühen Morgen auf der gemeinsamen Reise weiterging. So aufgeregt sogar, dass man seinen gestarteten Prozess als erstes Abschiessen und neu starten musste. Nach diesem ersten Schreck renderte Jasper mühelos ein paar Beispieldatensätze. Alles schien gut zu laufen aber nach einer Weile begegneten sie im Debug-Umfeld einer Liste von Strings, die sich nicht einfach so darstellen lassen wollte. Eine weitere Challenge wartete:

3. List<String>

Urfell bekundete Mühe, die Strings auslesen zu können, und sein Kollege konnte ihm auch nicht auf Anhieb helfen. Es war kein Problem, solange es sich um eine Liste von Objekten handelte, bei der mittels Attributname zugegriffen werden konnte. Der Entwickler entlockte Jasper dann doch noch das Geheimnis. Es lag in den Tiefen dessen Sourcecodes. Das Zauberwort hiess _THIS und war mit viel Liebe hard gecodet. Folgende Konfiguration führte zum Ziel:

 

In der DataSource war folgendes nötig:

Der Report gedeihte und wurde immer schöner – aber wie gross war der Schock, als beim Zoomen die kleinen eingebetteten Bilder sich zu hässlichen Pixelmonstern verwandelten. Es mussten andere Icons her: Urfell fiel sofort das Zauberwort SVG ein – „Schön VerGrössern“ oder natürlich auch „Schön VerGleinern“. Wie würde wohl Jasper auf diese Idee reagieren?

4. Einbetten von SVG Grafiken

Frühere Anleitungen empfahlen den Einsatz des BatikRenderers. Oh je, dieser war aber deprecated. Urfell schaute sich die Kommentare ein wenig an und stellte fest: ResourceRenderer war der Nachfolger. Dieser war mühelos eingebunden, zu mühelos offenbar… Es stellte sich nämlich heraus, dass dieser nicht mit InputStreams umgehen konnte, was für diesen konkreten Fall (WAR File im JBoss) nicht funktionierte. Eine geeignete Alternative fand Urfell auf die Schnelle keine, so musste halt trotzdem der BatikRenderer ran:

Im Java Code brauchte es folgendes:

Wie erwärmte sich Urfells Herz, als er sich jedes Entwicklers Lieblingsarbeit, dem Styling widmen konnte. Die Anforderung war klar: veränderte Daten mussten farblich hervorgehoben werden. Jasper ermutigte ihn mit der Präsenz der Conditional Styles. Stilvoll gings an die Arbeit…

5. Conditional Styles

Alles schien sich langsam aber sicher zum Guten zu wenden, als plötzlich die Frage auftauchte :“Darf ich JasperReports überhaupt in einem Closed Source Projekt einsetzen, wenn eine Abhängigkeit dabei ist, die AGPL verwendet, namentlich iText?“

6. iText mit AGPL

Grundsätzlich war die Frage natürlich berechtigt. Das Vorhandensein einer AGPL (Affero General Public License) Library hätte den Einsatz von JasperReports tatsächlich verunmöglicht und für dieses konkrete Projekt eine License to Kill dargestellt. Urfells Bedenken konnten zum Glück von Jasper als unbegründet erklärt werden, da JasperReports auch in der neusten Fassung (6.7.0) eine auf 2.1.7 basierte Version von iText einsetzt, welche noch die Mozilla Public License verwendet.

Uff, noch einmal Schwein gehabt! Urfell und Jasper näherten sich einem gelungenen Abschluss. Das Thema „ungewollte Seitenwechsel“ machte ihnen noch kurz zu schaffen mit prominenten Schlagwörtern wie beispielsweise splitType=“Prevent“ oder RewindableDatasource. Der Applikationsverantwortliche war aber in dieser Hinsicht nicht kleinlich und liess den Fünfer gerade sein, damit doch noch Ruhe im Land eintreten konnte.

Urfell war erleichtert, mit seinem Freund das Ziel in der vorgegebenen Zeit und zur Zufriedenheit des Auftraggebers erreicht zu haben. Auf dem Weg dahin war er sich allerdings nie so ganz sicher, ob er wirklich in einem kleinen „Entwicklermärchen“ oder doch eher in einem großen Jasperli Theater mitspielte. 😉

1 Kommentar

  • Jenny Isenschmid, 23. Januar 2019

    Cooler Blog!