Jasper Report + Tapestry

Editado:
Les dejo como implemente mi generacion de reportes usando jasper Reports en Tapestry5.

Comienzo desde la parte en que ya se tiene el reporte.

Caracteristicas:

Manejo JRBeanCollectionDataSource puesto que estamos utilizando un ORM para la obtencion de los datos y no queremos queries en el reporte.
Manejamos el template en otro servidor para poderlos cambiar si asi se requiere (creanme funciona lo he realizado incontables veces)

De ahi tengo 2 Clases principales: una que genera el reporte y otra mas para generar la respuesta de stream de tapestry.

Como manejo archivos dentro de la app tengo un wrapper para eso.

Receta:

Primeramente agregamos la dependencia de reports yo estoy utilizando maven, esta version tendra que ser compatible con nuestro editor de las plantillas:

 

Como les mecione utilizo archivos en la app asi que tengo una clase wrapper de archivos, la cual es la siguiente. P.D. utilizo lombok por eso las anotaciones:

 

Por aqui tenemos la clase que es encargada de tomar la informacion que se exportara al reporte, el tipo de reporte que se requiere CSV, PDF, EXCEL o HTML, en mi caso solo tengo implementados PDF y EXCEL y para eso utilizo un enumerador.

 

Esta clase se encargara de generar las respuestas que acepta Tapestry (StreamResponse) y que la utilizaremos en nuestras paginas Tapestry:

 

Como les mencione tengo implementados unicamente PDF y EXCEL (uds pueden agragar los que faltan o necesitan) en mi app, asi que tengo un Enumerador que almacena el comportamiento de: impresion de reporte, extencion de archivo y content-type de http:

 

Por este lado tenemos el Enumerador que contiene las direcciones y nombres de los reportes, recordemos que los manejo en otro servidor.

 

Y para darle uso a todo esto pues tengo en una parte de mi servicio un metodo que invoca el llamado dada una colecion de objetos que se mandaran a un reporte:

En este caso invocare una exportacion a EXCEL asi que queda de la siguiente manera:
 

Y finalmente mi invocacion desde un evento en la pagina de Tapestry

 

Bueno se preguntaran por que tengo separado el generador de reporte y la generacion del stream, por dos cosas una codigo mas limpio y dos por que tambien tengo que enviar por correo el reporte asi que mando el file :) a mi servicio de correos y listo...

Recordemos que el POJO que se envia en la coleccion de datos debera tener las propiedades que el reporte tenemos como fields,

Si en el reporte tenemos:
String name
String age
String description
Date date

en el POJO debemos tener

 

Bueno espero les ayude y si tienen preguntas o comentarios son bien venidos...

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Mauricio89

Duda

en que direccion van los archivos .java no se en que parte ubicarlos...

Imagen de arterzatij

Va a depender que archivos

Va a depender que archivos tienes pero segun la estructura de Tapestry

Ticket es una entidad asi que va con los modelos
ReportGenerator es un servicio
StreamResponseFactory es una utileria desde mi punto de vista asi que la puedes ubicar en un utils
Las paginas pues con los pages
Enumeradores los ubico en un paquete data

foo.bar.data
foo.bar.model
foo.bar.pages
foo.bar.services
foo.bar.utils

Imagen de Mauricio89

Errores

Disculpa me salen algunos errores como en la clase para generar el reporte en esta parte..
File file = new File();
file.setContent(baos.toByteArray());
file.setExtension(type.getExtension());
file.setName(name);
file.setSize(baos.size());
file.setTitle(name);
file.setType(type.getType());

Imagen de arterzatij

Lo mas seguro es que no estan

Lo mas seguro es que no estan generados los getters y setters (lombok), solo remueve las anotaciones @Getter @Setter Y @HashCode... y genera tu los getters y setters.