BIRT

Descripción

AFRYCA 3 permite la visualización de datos mediante gráficos de diversos tipos. Para la generación de dichos gráficos, se ha empleado BIRT (Business Intelligence and Reporting tools), un proyecto software de código abierto que proporciona múltiples funcionalidades en cuanto a visualización de datos y generación de informes se refiere y que puede ser integrado en aplicaciones RCP y web, especialmente en aquellas basadas en Java y Java EE. El proyecto está respaldado por Actuate junto con las contribuciones de IBM e Innovent Solutions.

En AFRYCA 3, existe una estrecha relación entre BIRT y el entorno de scripting ASE, ya que se hace uso de scripts ejecutados por el entorno que permiten al desarrollador generar sus propios gráficos y diseñarlos a su gusto, e incluso decidir qué gráficos se quieren mostrar en la aplicación y cuáles no.

Features

La funcionalidad se proporciona desde las siguientes features:

afryca.birt.feature

Plug-ins para el funcionamiento de BIRT

  • Plugins incluídos
    • afryca.birt
    • javax.el
    • javax.servlet.jsp
    • javax.xml.stream
    • org.apache.commons.logging
    • org.apache.derby
    • org.apache.jasper.glassfish
    • org.eclipse.birt.report.desginer.core
    • org.eclipse.core.filebuffers
    • org.eclipse.core.filesystem
    • org.eclipse.core.resources
    • org.eclipse.datatools.connectivity.apache.derby
    • org.eclipse.datatools.connectivity.oda.design.ui
    • org.eclipse.datatools.connectivity.sqm.core
    • org.eclipse.datatools.connectivity.ui
    • org.eclipse.datatools.help
    • org.eclipse.datatools.modelbase.dbdefinition
    • org.eclipse.datatools.modelbase.derby
    • org.eclipse.datatools.modelbase.sql
    • org.eclipse.datatools.modelbase.sql.edit
    • org.eclipse.datatools.modelbase.sql.query
    • org.eclipse.datatools.modelbase.sql.query.edit
    • org.eclipse.datatools.modelbase.sql.xml.query
    • org.eclipse.draw2d
    • org.eclipse.emf.ecore.edit
    • org.eclipse.equinox.http.registry
    • org.eclipse.equinox.jsp.jasper
    • org.eclipse.equinox.jsp.jasper.registry
    • org.eclipse.gef
    • org.eclipse.jetty.deploy
    • org.eclipse.jetty.osgi.boot
    • org.eclipse.jetty.webapp
    • org.eclipse.jetty.xml
    • org.eclipse.ltk.core.refactoring
    • org.eclipse.text
    • org.eclipse.ui.forms
    • org.eclipse.ui.navigator
    • org.eclipse.ui.views
  • Features incluídas
    • org.eclipse.birt.chart.osgi.runtime
    • org.eclipse.birt.engine.runtime
    • org.eclipse.birt.osgi.runtime
    • org.eclipse.datatools.connectivity.oda.feature
    • org.eclipse.datatools.enablement.oda.feature
    • org.eclipse.help

Plug-ins

Los plug-ins desarrollados de forma específica para proveer su funcionalidad son los siguientes:

afryca.birt

Funcionalidad básica para la generación de gráficos

  • Dependencias
    • afryca.ase
    • afryca.workspace.service.events
    • org.eclipse.birt.core
    • org.eclipse.birt.chart.engine
    • org.eclipse.birt.chart.engine.extension
    • org.eclipse.birt.report.engine
    • org.eclipse.birt.report.model
    • org.eclipse.core.runtime
    • org.eclipse.e4.ui.di
    • org.eclipse.e4.core.contexts
    • org.eclipse.e4.core.services
    • org.eclipse.e4.ui.workbench
    • org.eclipse.e4.ui.model.workbench
    • org.eclipse.ui
    • com.ibm.icu

Estructura

La utilidad de los diferentes paquetes y clases que conforman los plug-ins es la siguiente:

afryca.birt

  • afryca.birt.builder
    • AbstractChartBuilder: Clase abstracta para la construcción de gráficos.
    • AbstractChartWithAxisBuilder: Clase abstracta para la construcción de gráficos con ejes.
    • AreaChartBuilder: Constructor de gráficos de área.
    • BarChartBuilder: Constructor de gráficos de barras.
    • LineChartBuilder: Constructor de gráficos de líneas.
    • PieChartBuilder: Constructor de gráficos circulares.
    • BIRTCompositeBuilder: Constructor de un objeto BIRTComposite.
    • ChartCanvas: Constructor de un objeto canvas donde pintar un gráfico.
  • afryca.birt.composite
    • BIRTComposite: Modelo que define un composite donde incorporar uno o más gráficos.
  • afryca.birt.composite.job
    • UpdateBIRTChartJob: Trabajo eclipse que al entrar en ejecución actualiza un gráfico.
  • afryca.birt.l10n: Mensajes de localización en diferentes idiomas.
  • afryca.birt.provider
    • BIRTServiceContextFunction: Función contextual empleada para instanciar el servicio BIRT cuando se solicita su inyección.
    • BIRTServiceProvider: Proveedor del servicio BIRT.
  • afryca.birt.service
    • IBIRTService: Interfaz del servicio BIRT.

Servicio

El plug-in afryca.birt define un servicio declarativo OSGi para la representación de gráficos. El servicio se define en el archivo OSGI-INF/birt_service_context_function.xml y hace uso de una función contextual eclipse, la cual realiza una instanciación de la clase afryca.birt.service.provider.BIRTServiceContextFunction cuando se solicita la inyección del servicio cuya interfaz define afryca.birt.service.IBIRTService.

  • Interfaz del servicio:
    • createBIRTCompositeBuilder() : BIRTCompositeBuilder // Creación de una instancia BIRTCompositeBuilder
    • createReport(String) // Creación de un informe.
    • setInitialPropertiesReport(String, String, String, String) // Asignación de diferentes propiedades básicas a un informe.
    • setPropertyReport(String, String) // Asignación de una propiedad a un informe.
    • createMasterPage(String) // Creación de una Master Page.
    • setPropertyMasterPage(Integer, String, String) // Asignación de una propiedad a una Master Page.
    • createScriptDataSource(String) // Creación de un  objeto ScriptDataSource.
    • setPropertyDataSource(Integer, String, String) // Asignación de una propiedad a un script data source.
    • createScriptDataSet(String) // Creación de un objeto ScriptDataSet.
    • setOpenScriptDataset(String) // Asignación del código que se ejecutará cuando el dataset se abra.
    • setFetchCodeScriptDataset(String) // Asignación del código que se ejecutará al recorrer los datos almacenados en el dataset.
    • setOutputColumnCategorySeries(String) // Creación de una columna de datos que define una categoría en un gráfico.
    • setOutputColumnSeries(String) // Creación de una columna de datos.
    • setResultsColumn(String, String, Integer) // Creación de una columna de datos finales.
    • createAreaChartInReport(String, String, String, String, String) // Creación de un gráfico de área en un informe mediante un ScriptDataset.
    • createAreaChart(String, String, String, String[], Double[]) // Creación de un gráfico de área mediante un data set predefinido.
    • createBarChartInReport(String, String, String, String, String) // Creación de un gráfico de barras en un informe mediante un ScriptDataset.
    • createBarChart(String, String, String, String[], Double[]) // Creación de un gráfico de barras mediante un data set predefinido.
    • createLineChartInReport(String, String, String, String, String) // Creación de un gráfico de líneas en un informe mediante un ScriptDataset.
    • createLineChart(String, String, String, String[], Double[]) // Creación de un gráfico de líneas mediante un data set predefinido.
    • createPieChartInReport(String, String, String) // Creación de un gráfico circular en un informe mediante un ScriptDataset.
    • createPieChart(String, String[], Double[]) // Creación de un gráfico circular mediante un data set predefinido.
    • updateDataset(String[], Double[], Composite) // Actualización del data set predefinido de un gráfico.
    • createOutputHTMLChart(ClassLoader): ByteArrayOutputStream // Mostrar gráfico mediante un HTML render.
    • saveAsReport() // Guardar report.
    • shutdown() // Apagar el engine de BIRT.
    • createCanvas(Composite, Integer) // Crear canvas para dibujar el gráfico.
    • disposeCanvas(Composite) // Eliminar canvas.

Notas finales

  1. Para poder representar un gráfico en AFRYCA, es indispensable el uso de la clase BIRTCompositeBuilder. Esta clase nos proporciona la funcionalidad para crear composites donde visualizar los gráficos, para ello es necesario emplear el servicio BIRT, concretamente la función createBIRTCompositeBuilder(). Esta función, mediante inyección de dependencias, obtiene una instancia de la clase BIRTCompositeBuilder y la inyecta en un contexto específico. Una vez creado la instancia y asignada a un contexto, debemos asignar diferentes atributos que posee la clase mediante las siguientes funciones:
    • setModule(String): asigna el modulo definido en ASE para la creación de gráficos.
    • setNode(String): asigna el nodo de preferencias.
    • setKey(String): asigna la clave de preferencias donde se incluyen las funciones que usa ASE para la creación de los gráficos.
    • setParent(Composite): asigna el composite donde queremos visualizar el gráfico.
    • setStyle(Integer): asigna el estilo del composite.
    • build(): crea un BIRTComposite.
  2. El servicio BIRT proporciona la funcionalidad de generar gráficos a partir de diferentes datasets. Los datos de un gráfico pueden ser generados mediante la definición de categorías y series a partir de un array de tipo String y Double respectivamente, y asignarlos a los gráficos mediante las funciones createXChart. Además, se pueden generar gráficos dentro de un report o informe, pero en este caso, los datos se proporcionan mediante un objeto ScriptDataSet, que se genera mediante la función createScriptDataSet(String). Este objeto permite crear un dataset a partir de un script en lenguaje JavaScript, que puede ser definido mediante una variable tipo String que incluya el código que queremos ejecutar en según qué situaciones. El servicio nos da la opción de ejecutar código JavaScript cuando el ScriptDataSet se abre (lectura de los datos) a través de la función setOpenScriptDataSet(String) y también a la hora de recorrer los datos para visualizarlos a través de la función setFetchCodeScriptDataSet(String).
  3. Por lo tanto, y teniendo en cuenta los puntos 1 y 2, podemos generar gráficos de dos formas diferentes:
    1. Gráfico en composite y dataset definido mediante la definición de categorías y series: Para ello únicamente hay que usar la función correspondiente al tipo de gráfico que queremos mostrar createXChart. Después únicamente tenemos que crear el canvas donde vamos a visualizar el gráfico, que estará incluído en el composite referenciado en el paso 1, para ello usamos la función createCanvas(Composite, Integer).
    2. Gráfico en informe y dataset definido mediante un objeto ScriptDataSet:  Lo primero que debemos hacer es usar la función createReport(String) para crear el informe en la ruta que indiquemos, una vez creado, podemos asignarle diferentes propiedades básicas como el título, descripción etc.,  mediante las función setInitialPropertiesReport(String, String, String, String). El siguiente paso es crear una Master Page dentro del informe mediante la función createMasterPage(String), a la que también podemos asignar propiedades a través de la función setPropertyMasterPage(Integer, String, String). Una vez hecho esto, debemos crear un objeto ScriptDataSource, que establece un enlace entre el informe y el ScriptDataSet, para ello usamos la función createScriptDataSource(String). El siguiente paso es definir el script dataset tal y como se ha indicado en el punto 2 y una vez creado, definir las diferentes categorías y series mediante las funciones setOutputColumnCategorySeries(String)setOutputColumnSeries(String). Hay que tener en cuenta que los nombres que les asignemos a estas columnas deben coincidir con los que hayamos definido en el código en JavaScript para la lectura de los datos del dataset a través de la función setOpenScriptDataSet(String). Para definir el tipo de gráfico que queremos crear, tenemos que hacer uso de las funciones del tipo createXChartInReport. Por último, guardamos el informe creado mediante la función saveAsReport() y liberamos el engine de BIRT usando shutdown().
  4. Para ver más información y ejemplos acceder a la página web de BIRT.