Jasper reports on Vaadin sample

    First, you will need a JDK Maven and Mysql in order to try the sample, and you can download the code here: http://sourceforge.net/projects/jrtutorial/files/VaadinJRSample/

    There is a README.txt file you can follow in order to run the sample, basically you need to:

    1. Create database running resources/database.sql on Mysql or MariaDB

    2. Compile the entire project: run “mvn install”.

    3. Deploy the application in Jetty: run “mvn jetty:run”

    4. Go to in your browser

    Implementation

    Let’s see the sample code step by step.
    The data is only a person table with some data.
    The main class MyUI.java has two UI components (the report generating button and a list component used to show current data in database.):

    Java

    The list is implemented on PersonList.java, I am using a FilteringTable (), that loads the data using a Vaadin SQLContainer:

    Java

    1. TableQuery tq = new TableQuery("person", new ConnectionUtil().getJDBCConnectionPool());
    2. container = new SQLContainer(tq);
    3. filterTable = buildPagedTable(container);

    Java

    1. Properties prop=PropertiesUtil.getProperties();
    2. public JDBCConnectionPool getJDBCConnectionPool(){
    3. try {
    4. pool = new SimpleJDBCConnectionPool(
    5. prop.getProperty("database.driver"),
    6. prop.getProperty("database.url"),
    7. prop.getProperty("database.password"));
    8. } catch (SQLException e) {
    9. e.printStackTrace();
    10. }
    11. return pool;

    The report generation is implemented on ReportGenerator class, this class loads the report template:

    Java

    Compile report template:

    Java

    1. jasperReport = JasperCompileManager.compileReport(jasperDesign);

    Fill report with data:

    Java

    1. HashMap fillParameters=new HashMap();
    2. JasperPrint jasperPrint = JasperFillManager.fillReport(
    3. jasperReport,
    4. conn);

    Export the jasperPrint object to Pdf format:

    Java

    And finally execute all the logic to generate the report and sent it to an OutputStream:

    1. JasperDesign jasperDesign=loadTemplate(templatePath);
    2. JasperReport jasperReport=compileReport(jasperDesign);
    3. JasperPrint jasperPrint=fillReport(jasperReport, conn);
    4. exportReportToPdf(jasperPrint, outputStream);

    But all the logic at ReportGenerator.java is called from the ReportUtil class, this class is the responsible to connect Vaadin layer with ReportGenerator layer. There are two methods: the first one is prepareForPdfReport, this method creates a database connection, generates the report as a StreamResource (calling the another method) and finally extends the source button with a FileDownloader component in order to upload the generated report stream, so all the uploading magic is done by FileDownloader extension (https://vaadin.com/api/com/vaadin/server/FileDownloader.html):

    Java

    1. Connection conn=new ConnectionUtil().getSQLConnection();
    2. reportOutputFilename+=("_"+getDateAsString()+".pdf");
    3. StreamResource myResource =createPdfResource(conn,reportTemplate,reportOutputFilename);
    4. FileDownloader fileDownloader = new FileDownloader(myResource);
    5. fileDownloader.extend(buttonToExtend);

    The second method createPdfResource, uses ReportGenerator class in order to return the generated report as a StreamResource:

    Java

    So, in order to call the report generator process when only need to call ReportUtil like we did in ‘MyUI.java’:

    Java

    1. final Button reportGeneratorButton = new Button("Generate report");
    2. new ReportsUtil().prepareForPdfReport("/reports/PersonListReport.jrxml",
    3. "PersonList",

    Finally, the jasper report design can be found in the WEB-INF/personListReport.jrxml file

    This is a picture of the sample running and the generated report:

    And that’s all, I expect to help someone with this sample, thanks for reading.