JasperReports Ultimate Guide - Sample Reference - Schema Reference - Configuration Reference - API (Javadoc)

JasperReports - jCharts Component Sample (version 6.4.1)


Shows how jCharts components can be included in reports.

Download All Sample Source Files
Browse Sample Source Files on Git


Main Features in This Sample

Implementing Custom Components to Embed Third Party Visualisation Tools (jCharts Library)


top

Implementing Custom Components to Embed Third Party Visualisation Tools (jCharts Library)Documented by Sanda Zaharia


Description / Goal
How to implement a custom component to wrap charts rendered by the jCharts library.

Since
3.1.0

Other Samples
/demo/samples/openflashchart


The JCharts Component - Overview

This sample contains an axis chart component implementation based on the jCharts library, that illustrates how charts generated with 3-rd party APIs can be embedded in reports generated with the JasperReports library. To make such an integration possible, the chart component provides its specific XSD schema in the src/jcharts/charts.xsd file.
On the API side, the chart component is represented by the jcharts.AxisChartComponent class, which exposes the members declared in schema. When the report is filled, a JRImageRenderer instance is created in order to generate a chart image to be included into the report. The image representation of the chart was preferred instead of the chart itself because AxisChart objects fail on serialization.

The JCharts Component - Schema

Here is the JRXML schema for the axis chart component:
<element name="axisChart" substitutionGroup="jr:component">
  <complexType>
    <complexContent>
      <extension base="jr:componentType">
        <sequence>
          <element ref="jc:axisDataset"/>
          <element name="legendLabelExpression">
            <complexType mixed="true"/>
          </element>
        </sequence>
        <attribute name="areaColor" type="string" use="required"/>
        <attribute name="evaluationTime" type="jr:basicEvaluationTime" use="optional" default="Now"/>
        <attribute name="evaluationGroup" type="string" use="optional"/>
      </extension>
    </complexContent>
  </complexType>
</element>

<element name="axisDataset">
  <complexType>
    <sequence>
      <element ref="jr:dataset" minOccurs="0" maxOccurs="1"/>
      <element name="labelExpression">
        <complexType mixed="true"/>
      </element>
      <element name="valueExpression">
        <complexType mixed="true"/>
      </element>
    </sequence>
  </complexType>
</element>
A well defined axis chart configuration contains:
  • an axisDataset - the area chart dataset characterized by the dataset, labelExpression and valueExpression.
  • a legendLabelExpression - the expression used to set labels in the chart legend.
and provide the following attributes:
  • areaColor - the color of the area. Allowed values are either the color hexadecimal RGB notation, or color names preset in the ColorEnum.
  • evaluationTime and evaluationTime with the same meaning as for built-in report elements.
Embedding The JCharts Component

The src/jasperreports_extension.properties file contains the following entries:
  • net.sf.jasperreports.extension.registry.factory.charts=net.sf.jasperreports.extensions.SpringExtensionsRegistryFactory
  • net.sf.jasperreports.extension.charts.spring.beans.resource=jcharts/chart_beans.xml
Hence this component will be registered as Spring-based extension, in accordance with beans in the src/jcharts/chart_beans.xml:
<bean id="componentsBundle" class="net.sf.jasperreports.engine.component.DefaultComponentsBundle">
  <property name="xmlParser">
    <ref local="xmlParser"/>
  </property>
  <property name="componentManagers">
    <map>
      <entry key="axisChart">
        <ref local="axisChartManager"/>
      </entry>
    </map>
  </property>
</bean>

<bean id="xmlParser" class="net.sf.jasperreports.engine.component.DefaultComponentXmlParser">
  <property name="namespace">
    <value>http://jasperreports.sourceforge.net/jasperreports/jcharts</value>
  </property>
  <property name="publicSchemaLocation">
    <value>http://jasperreports.sourceforge.net/dtds/charts.xsd</value>
  </property>
  <property name="internalSchemaResource">
    <value>jcharts/charts.xsd</value>
  </property>
  <property name="digesterConfigurer">
    <bean class="jcharts.ChartsDigester"/>
  </property>
</bean>

<bean id="axisChartManager" class="net.sf.jasperreports.engine.component.DefaultComponentManager">
  <property name="componentCompiler">
    <bean class="jcharts.AxisChartCompiler"/>
  </property>
  <property name="componentXmlWriter">
    <bean class="jcharts.AxisChartXmlWriter"/>
  </property>
  <property name="componentFillFactory">
    <bean class="jcharts.AxisChartFillFactory"/>
  </property>
</bean>
The src/jcharts directory contains all necessary implementation APIs for this component:
  • AxisChartCompiler.java - the compiler class for the axis chart component
  • AxisChartComponent.java - the axis chart component
  • AxisChartFillFactory.java - the fill factory class for the component
  • AxisChartXmlFactory.java - the XML factory class for the component
  • AxisChartXmlWriter.java- the component XML writer
  • AxisDataset.java - the axis dataset element
  • AxisDatasetXmlFactory.java - the XML factory class for the axis dataset
  • ChartsDigester.java - the specific Digester class for the axis chart component
  • CompiledAxisDataset.java - the compiled axis dataset class
  • DesignAxisDataset.java - the design axis dataset object
  • FillAxisChart.java - the fill object related to the axis chart
  • FillAxisDataset.java - the fill object related to the axis dataset
The JCharts Component - Sample

An example of how to use the axis chart component is illustrated in the reports/AxisChart.jrxml template:
<variable name="Value" class="java.lang.Double">
  <variableExpression>
    new Double(Math.pow($V{REPORT_COUNT}.doubleValue(), 4 - Math.log($V{REPORT_COUNT}.doubleValue())))
  </variableExpression>
</variable>

...

<componentElement>
  <reportElement x="0" y="70" width="500" height="300"/>
  <jc:axisChart xmlns:jc="http://jasperreports.sourceforge.net/jasperreports/jcharts"
      evaluationTime="Report" areaColor="cyan">
    <jc:axisDataset>
      <dataset/>
      <jc:labelExpression>$V{REPORT_COUNT}.toString()</jc:labelExpression>
      <jc:valueExpression>$V{Value}</jc:valueExpression>
    </jc:axisDataset>
    <jc:legendLabelExpression>"Data"</jc:legendLabelExpression>
  </jc:axisChart>
</componentElement>
The report is filled using an empty data source with 12 records, as shown in src/JChartsApp.java:
public void fill() throws JRException
{
  long start = System.currentTimeMillis();
  JasperFillManager.fillReportToFile("build/reports/AxisChart.jasper", null, new JREmptyDataSource(12));
  System.err.println("Filling time : " + (System.currentTimeMillis() - start));
}
The output in this case will be an area chart with 12 integer values on the x-axis. The related y-values are calculated in the $V{Value} variable expression. The output area color is cyan and the legend will be labeled "Data".

Running the Sample

Running the sample requires the Apache Ant library. Make sure that ant is already installed on your system (version 1.5 or later).
In a command prompt/terminal window set the current folder to demo/samples/jchartscomponent within the JasperReports source project and run the > ant test view command.
It will generate all supported document types containing the sample report in the demo/samples/jchartscomponent/build/reports directory.
Then the report will open in the JasperReports internal viewer.



© 2001- TIBCO Software Inc. www.jaspersoft.com