Der [JasperReports Server|https://sourceforge.net/projects/jasperserver/] ist ein Webserver, der JasperReports verwalten und anzeigen kann. Man erzeugt seine Berichte wie bei JasperReports üblich mit dem Programm ~JasperStudio und lädt diese dann auf den Server hoch. Dort kann dann ein Benutzer, der sich dort anmeldet (oder auch ein anonymer Benutzer) die vorbereiteten Berichte einfach über die Weboberfläche abrufen.

== Dokumentation und Download ==

Wenn man sich dem Programm nähert, sollte man wissen, das es zwei verschiedene Versionen gibt: Die kommerzielle Version bekommt man von den Seiten der Firma Jaspersoft, die Community Edition (CE) von der o.g. Sourceforge-Seite. Dort sollte man auch die Dokumentation herunterladen, um keine Verwirrung aufkommen zu lassen.

== Funktionsumfang ==

Bei mir gab es am Anfang einige Verwirrung, was die freie Version denn nun kann und was nicht. Deshalb hier eine kurze Beschreibung: Der JasperServer stellt im Prinzip ein Repository dar, in dem Jasper-Dateien, also Berichtstemplates, Grafiken, Eingabeparameter, Queries, Bilder, Datenquellen, etc. abgelegt werden. Man kann sich als Benutzer anmelden und dann kann über den Benutzer oder eine Benutzergruppe festgelegt werden, auf welche Dateien man zugreifen kann. Ein Report ist normalerweise als eine Report Unit abgelegt, das ist im Grunde eine Sammlung mit verschiedenen Dateien (intern also sowas wie ein Verzeichnis), das man mit einem Klick starten kann. Der entsprechende Bericht wird dann angezeigt.

Das Anzeigen eines Berichts bedeutet, das ggf. Parameter beim Benutzer abgefragt werden. So kann also z.B. für eine Auswertung ein Monat eingegeben werden, den man sich ansehen möchte oder ähnliches.

Wird der Bericht als PDF angezeigt, kann man ihn in den anderen von JasperReports unterstützten Formaten herunterladen, also z.B. als Excel- oder LibreOffice- oder als CSV-Datei.

Es ist möglich, Berichte anonym anzuzeigen. Dadurch kann man mit einem einzigen Weblink einen Bericht anzeigen (sogar so, das man den JasperServer dann gar nicht mehr sieht).

Es gibt eine Funktion, um Berichte zeitgesteuert automatisch zu erzeugen und zu speichert und dann ggf. auch als Mail zu versenden. Das habe ich noch nicht ausprobiert.

Darüberhinaus gibt es eine Integration von Mondrian für Business Intelligence, damit habe ich mich allerdings bisher noch nicht beschäftigt.

Es ist nicht möglich, eigene Berichte über die Weboberfläche zu erzeugen. Dieses Feature (das echt hilfreich wäre), nennt sich "Ad Hoc Reports" und ist nur in der kostenpflichtigen Version enthalten.

== Installation und erste Schritte ==

Ich empfehle, eng der Installationsempfehlung aus der Dokumentation zu folgen. Wählt man die komplette Installation aller Komponenten, so geschieht alles von alleine. Das Installationsskript installiert einen eigenen PostgreSQL Datenbankserver und startet dann einen Tomcat Application Server. Mit der URL http://localhost:8080/jasperserver/ im Browser kann man dann auch schon loslegen. Benutzername und Passwort für den Admin-User ist beides jasperadmin. Der Admin-User kann übrigens auch alles, was der normale User kann. Für den Anfang kann man sich also damit beschäftigen.

Es gibt Beispiel-Datenbanken mit einigen Berichten. Wer JasperReports kennt, wird da nichts wesentlich neues finden.

Wer mag, kann bei der Installation aber auch auswählen, das die Komponenten einzeln ausgewählt werden. Man kann dann die Datenbank auf einen vorhandenen PostgreSQL-Server legen (habe ich ausprobiert). Dazu gibt man das Passwort des postgres-Users an und das Installationsskript richtet dann alles ordentlich ein. Außerdem kann man den Server in einen vorhandenen Tomcat installieren. Und man kann wählen, ob man die Beispiel-Templates dabei haben möchte oder nicht. Für eine echte Installation lässt man die später besser weg.

Um den Server automatisch zu starten, habe ich [dieses Startskript|http://community.jaspersoft.com/questions/541044/auto-start-boot] genommen. Dabei habe ich es noch angepasst, indem ich "su jasper" vor die Aufrufe des ctrlscript geschrieben habe. Als root möchte (und darf) man den Server nicht starten.

== Hochladen mit ~JasperStudio ==

Das aktuell von Jaspersoft gepflegte und empfohlene Tool, um Berichte herzustellen, ist ~JasperStudio. Dort kann man im Repository-View einen Server angeben. In meiner Installation war der Server auf localhost bereits mit dem Standard-Passwort voreingestellt, so das die Verbindung tatsächlich wie magisch erst mal einfach da war. In einer echten Umgebung würde man das natürlich etwas anders machen. Dazu ist es interessant, zu wissen, das es im Repository-View ganz oben rechts ein Icon gibt (ein Kästchen mit einem grünen Kreuz), mit dem man eine neue Serververbindung erzeugen kann. Das ist nicht ganz offesichtlich und sonst nicht im Menü oder Kontextmenü zu erreichen (soweit ich das gesehen habe).

Hat man eine solche Verbindung aufgebaut, kann man im Design-Tab des Editor-Views ganz oben rechts auf ein Icon klicken, dessen Tooltip "Publish Report to Jasper Reports Server" anzeigt. Damit startet ein Fenster, das es erlaubt, den Bericht auf den Server zu laden.

Falls der Bericht Parameter definiert, die für eine Eingabe durch den Benutzer konfiguriert sind, können diese als eigene Resourcen, sogenannte Eingabesteuerelemente definiert werden (als eigene Dateien im Repository des Servers). Das erlaubt später, diese im Server näher zu konfigurieren und ggf. wohl auch für mehrere Berichte zu benutzen. Auf jeden Fall sollten diese Dateien extra gespeichert werden. Es ist dann z.B. möglich, das man ein Auswahlfeld durch einen Datenbank-Query füllen lässt ([siehe hier|http://community.jaspersoft.com/documentation/jasperreports-server-administration-guide/v550/query-based-input-controls]). Man kann also eine Auswahl von Kunden erlauben, in der alle aktuellen Kunden direkt aus der Datenbank geholt und dann zur Auswahl angeboten werden.

== Organisation der Dateien ==

Man sollte zuerst eine Datenquelle im Server anlegen. Irgendwie sollte man die auch vom Studio aus hochladen können, was mir aber nicht gelungen ist. Da man die Datenquelle allerdings im Normalfall nur einmal braucht, kann man die auch im Server anlegen.

== Anpassung der Login-Seite ==

Auf [dieser Seite|https://community.jaspersoft.com/documentation/jasperreports-server-ultimate-guide/v561/customizing-login-page] ist erklärt, wie man die Login-Seite anpasst. Die Standard-Seite verweist auf allerlei Dokumentationen etc. und ist für einen praktischen Einsatz nicht so schön zu gebrauchen.

Im Gegensatz zu der dortigen Erklärung habe ich lieber in der Datei login.jsp ein div-Element ("welcome") auskommentiert. Das reichte mir schon.

== anonymes Anzeigen ==

Mit der [Anleitung auf dieser Seite|http://community.jaspersoft.com/wiki/allow-anonymous-access-reports] habe ich den Zugriff durch den Anonymen Benutzer hinbekommen.

Indem ich zusätzlich zum viewReportFlow auch den searchFlow für den anonymen Benutzer freigegeben habe, konnte er auch das Repository anzeigen und dann aus allen Berichten, die für die anonyme Rolle freigegeben sind, auswählen, was er haben will. Ob man diese Übersicht erlauben will oder eine Gruppe von Links irgendwo auf eine Seite oder in ein Wiki schreibt, ist Geschmackssache. Im übrigen habe ich es nicht geschafft, die Bibliothek anzuzeigen (die wohl eher der richtige Platz wäre), sondern nur das Repository.

Damit ist es dann möglich, einen Bericht direkt so aufzurufen, das er sofort angezeigt wird oder so, das man direkt die Eingabefelder für die Parameter angezeigt bekommt. Ob dabei der Header vom JasperServer angezeigt wird, über dessen Menüknöpfe man dann weiterspringen kann zu anderen Berichten oder nicht, kann man auch auswählen, indem man die URL richtig konstruiert.

Möchte man den richtigen Link für einen Bericht haben, so geht man als Benutzer in das Programm und zeigt einen Bericht (über das Kontextmenü) in einem anderen Browsertab an. In diesem Tab steht dann der richtige Link, den man ggf. noch erweitern kann.

== Versionsverwaltung in Jaspersoft Studio ==

Wer mit einem Server arbeitet, möchte eventuell auch die erzeugten Berichts-Templates im einer VersionsVerwaltung verwalten und vielleicht sogar auch von mehreren Rechnern oder Benutzern aus verwenden. Ich selber verwende MercurialVersionControl, aber z.B. für GIT sollte das gleiche gelten.

=== Verwaltung mit einem VCS (VersionsVerwaltung) ===

Ich habe für meine Arbeit im Studio ein neues, eigenes Projekt erzeugt. Meine Berichte liegen also nicht im Standardprojekt "~MyReports". Das Programm legt dann hierfür im Workspace ein neues Verzeichnis an. Falls man nicht weiss, wo sein Workspace ist, kann man im File-Menü den Workspace wechseln und bekommt dann den Pfad angezeigt.

Ich bin dann auf die Konsole gegangen und habe eine Datei .hgignore erzeugt mit folgendem Inhalt:

  .*\.jasper$

Danach habe ich mit den folgenden Befehlen eine Versionskontrolle mit Mercurial initiiert:

  hg init .
  hg add .hgignore
  hg add .project
  hg add .classpath
  hg add .settings/*
  hg add *.jrxml
  hg commit -m "Versionskontrolle eingerichtet"

Die Wartung und Pflege der Versionskontrolle (neue Dateien etc.) mache ich per Konsolenbefehle, weil ich da ganz gut mit zurecht komme. Prinzipiell befinden sich in den Menüs des Jaspersoft Studio auch Einträge, um mit der CSV Versionsverwaltung zu arbeiten. Diese Einträge sind in Eclipse Standard. Es kann sein, das die Jasper-Programmierer nur vergessen haben, diese zu entfernen. Mir würde das aber Hoffnung geben, das man im Studio auch ein Eclipse-Plugin für Mercurial installieren kann und dieses dann über die graphische Oberfläche nutzen kann. Das habe ich allerdings noch nicht ausprobiert.

=== Arbeit mit einer neuen Instanz ===

Obwohl das Studio sehr stark auf Eclipse basiert, funktioniert mein normaler Arbeitsablauf für diesen Fall nicht. Es fehlt die Möglichkeit, ein existierendes Projekt einzubinden. Also muss man etwas trickreich vorgehen: Ich habe zuerst im Studio ein neues Projekt mit dem gewünschten Namen angelegt, dann bin ich auf die Konsole gegangen (ohne das Studio zu schliessen), habe das Projektverzeichnis komplett gelöscht und dann mit "hg clone" das Verzeichnis aus der Versionsverwaltung komplett neu erzeugt. Dann habe ich im Studio mit "F5" das Projekt refresht. Und schon ist alles so da, wie ich es brauche.

== Einstellen der Eingangsseite ==

Normale Benutzer sollten, wenn Sie sich eingeloggt haben, direkt auf die Bibliotheks-Seite gelangen und nicht auf die Ansicht des Repositories. Die Bibliothek ist eine Übersicht der anzeigbaren Dokumente, während das Repository auch technische Dokumente und Ressourcen wie Datenquellen, Bilder, etc. in einem Dateibaum anzeigt.

Die vorgegebene Startseite kann man aber [konfigurieren|https://community.jaspersoft.com/documentation/jasperreports-server-ultimate-guide/v561/setting-home-page]

=== Logging ===

Bei Fehlern im Server werden diese nicht im Detail am Bildschirm angezeigt. Ich nehme an, die Entwickler hatten Angst, das der EWxception-Text oder die SQL-Meldung irgendwelche Geheimnisse verraten und eine Sicherheitslücke eröffnen könnten. Also muss man bei angezeigten Fehlern die Fehler-ID ignorieren (keine Ahnung, wofür die gut ist) und in die Logdatei schauen:

  apache-tomcat/webapps/jasperserver/WEB-INF/logs/jasperserver.log

=== Error 6632 security.Validator ===

Bei einem zugegebenermassen sehr komplexen Query wollte der Bericht auf einmal nicht mehr auf dem Server laufen, obwohl er im Studio ganz ordentlich lief. Im Log erhielt ich einen Hinweis auf Fehler 5532:

  2017-11-05 17:15:19,281 ERROR Validator,Geschäftspartner Statistik subreports #1:499 - Invalid SQL:Ein Fehler ist aufgetreten. Wenden Sie sich an Ihren Systemadministrator. (6632), SQL: 

Nach ein wenig Recherche fand ich einen [Foren-Eintrag|https://community.jaspersoft.com/questions/541948/error-6632-while-running-report], der erklärt, das das eine Warnung wegen einer möglichen SQL-Injection ist. Ich konnte diese aus meinem SQL-Code nicht herausfinden. Vielleicht lag es aber auch nur daran, das mein Code zu komplex zum überprüfen ist (ich habe noch keinen Parser/Checker gefunden, der mit WITH-Clauses zurechtkommt). Auf jeden Fall steht dort, das man einfach die sql-Validierung abschalten kann. Aber natürlich ab dann bitte recht vorsichtig... :-)

Mehr Infos gibt es im [Jaspersoft Server Security Guide|https://community.jaspersoft.com/documentation/tibco-jasperreports-server-security-guide/v640/protecting-against-sql-injection], mit dessen Hilfe ich mein PRoblem jetzt noch besser geglöst habe, indem ich den Validator so konfiguriert habe, das er mit meiner Eigenart umgehen kann, with-Clauses zu benutzen (und ja - daran lag es).

[{Tag Java Templates Datenbank}]