====== Implémentation des rapports ====== **[A partir de la RC1]** \\ Les rapports sont générés à l'aide de la librairie Jasper. ===== Architecture ===== Les rapports sont gérés par des classes dérivés de //GenericReportBean// (ou dans le cas de rapport "simple", sans paramètres, directement par une instance de //GenericReportBean//). Ils sont ensuite construit et mis en forme par la classe //JasperReportFactory// qui va, pour cela faire appel aux fonctionnalités de la librairie Jasper. {{:wiki:epims4_0m2:developer:epw-report-diagramme_classes.png|}} **Fig1 : Diagramme de classes du "moteur" de génération de rapport d'eP-Web** ===== Fonctionnement ===== La séquence de la génération d'un rapport est le suivant : * L'utilisateur, à partir d'une page JSP, lance l'export. * La page communique au ReportBean voulu les paramètres nécessaires à la constitution du rapport et lance la méthode export() (ou communication avec un Managed Bean intermédiaire qui transmettras les données au Bean du rapport). * La méthode export() des ReportBean va, en tout premier lieu, appeler la méthode initExport() qui va permettre de préparer et mettre en forme les paramètres (méthode vide dans le cas de //GenericReportBean//). * Puis une //JasperReportFactory// est créée. la commande d'export() va lui être passée avec les paramètres suivant : * //reportParameters// : une map contenant les paramètres du rapport (ex : id d'une étude, modèle d'un spectro, etc...) * //format// : le format dans lequel devra être construit le rapport : Excel, PDF, HTML (voir les attributs static de //GenericReportBean//) * //jasperFilePath// : le lien complet (dossier et nom du fichier) vers le fichier .jasper de description du rapport. * //exporterParameters// : une map contenant des paramètres de l'exporter (ex : Faut-il mettre une feuille par page pour un document excel, noms de ces feuilles) * La méthode export() de la //JasperReportFactory// va remplir le rapport (en se connectant à la base de donnée) puis vas le faire mettre au format voulu en le passant à la méthode adéquate. * Une fois le rapport formaté il va être renvoyé sous la forme d'un tableau de byte (//byte[]//) qui va être attrapé par le ReportBean et encapsulé dans une réponse HTTP. Le ReportBean envoie cette réponse ainsi qu'un message JSF de succès de l'opération. {{:wiki:epims4_0m2:developer:diagramme-seq-report.png|test}} **Fig2 : Diagramme de séquence de la génération de rapport dans eP-Web** ===== Intégration d'un nouveau rapport ===== Une fois un descripteur de rapport créé (avec [[http://jasperforge.org/plugins/project/project_home.php?group_id=83|iReport]] par exemple), Pour l'intégrer il faut suivre les étapes suivantes : - Recenser les paramètres nécessaires au rapport. 2 possibilités : * Si il n'a besoin d'aucun paramètre pas de nouvelle classe à créer. Il utilisera directement //GenericReportBean//. * Si il a besoin de paramètre. Il va falloir alors : * créer un ReportBean héritant de //GenericReportbean// (son nom sera si possible de la forme XXXReportBean). * dans le constructeur positionner l'attribut jasperFileName. * lui donner les attributs et les Getter & Setter adéquats. * Surcharger la méthode initExport() de //GenericReportBean// pour pouvoir renseigner les paramètres qu'il faut dans reportParameters et si besoin dans exporterParameters. Penser aussi a donner le format voulu et le nom du fichier final (reportFileName). - Déclarer la classe du rapport dans le fichier faces-managed-beans.xml * Si c'est un //GenericReportBean// : * Dans //// donner un nom en rapport avec ce sur quoi va porter le rapport * Dans //// donner le path de //GenericReportBean// * Ajouter les //// suivantes : * jasperFileName : le nom du fichier .jasper de description du rapport * choosedFormat : le format dans lequel sera le rapport (**ATTENTION** a bien utiliser les attributs static de //GenericReportBean//) * reportFileName : le nom du fichier de sortie du rapport. Si rien n'est spécifié ce sera //null//. * Si c'est une nouvelle classe : * Dans //// donner le nom de la classe * Dans //// donner le path de la classe.