de.chott.jfreechartsample.service.ChartService.java Source code

Java tutorial

Introduction

Here is the source code for de.chott.jfreechartsample.service.ChartService.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package de.chott.jfreechartsample.service;

import com.lowagie.text.Document;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import de.chott.jfreechartsample.boundary.PieChartDataService;
import de.chott.jfreechartsample.boundary.RingChartDataService;
import de.chott.jfreechartsample.model.PieChartData;
import de.chott.jfreechartsample.model.RingChartData;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.io.ByteArrayOutputStream;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.inject.Inject;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;

/**
 *
 * Stateless EJB, welche die Daten fr die Charts aus der Datenbank anfordert und daraus die Charts in ein PDF-File rendert.
 * 
 * @author CHOTT
 */
@Stateless
public class ChartService {

    @Inject
    private RingChartDataService ringChartDataService;

    @Inject
    private PieChartDataService pieChartDataService;

    /**
     * Hauptmethode dieses Services, welche alle Aktionen veranlasst.
     * 
     * @return Das fertige PDF-File als ByteArray
     */
    public byte[] getChartPDF() {
        return writeChartsToDocument(createPieChart(), createRingChart());
    }

    /**
     * Diese Methode erstellt ein PieChart aus den PieChart-Daten. Die Daten werden dabei nicht bergeben, sondern direkt vm Service angefragt.
     * Fr sptere Ausbaufhigkeit knnte man die zu verarbeitenden Daten als bergabeparameter mitgeben, statt sie direkt auslesen zu lassen.
     * 
     * @return das fertige PieChart.
     */
    private JFreeChart createPieChart() {
        DefaultPieDataset dataSet = new DefaultPieDataset();

        for (PieChartData data : pieChartDataService.loadAll()) {
            dataSet.setValue(data.getCountry(), data.getWeight());
        }

        JFreeChart chart = ChartFactory.createPieChart("Anteil am Fondsvermgen", dataSet, true, false,
                Locale.GERMANY);

        return chart;
    }

    /**
     * Diese Methode erstellt ein RingChart aus den RingChartDaten.
     * 
     * @return Das fertige RingChart.
     */
    private JFreeChart createRingChart() {
        DefaultPieDataset dataSet = new DefaultPieDataset();

        for (RingChartData data : ringChartDataService.loadAll()) {
            dataSet.setValue(data.getSecurity(), data.getWeighting());
        }

        JFreeChart chart = ChartFactory.createRingChart("", dataSet, true, false, Locale.GERMANY);

        return chart;
    }

    /**
     * Schreibt mehrere JFreeCharts in ein PDF. Fr jedes Chart wird hierbei eine halbe PDF-Seite verwendet.
     * 
     * @param charts
     * @return Das PDF als ByteArray
     */
    private byte[] writeChartsToDocument(JFreeChart... charts) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            float width = PageSize.A4.getWidth();
            float height = PageSize.A4.getHeight() / 2;
            int index = 0;

            Document document = new Document();
            PdfWriter writer = PdfWriter.getInstance(document, baos);
            document.open();
            PdfContentByte contentByte = writer.getDirectContent();

            for (JFreeChart chart : charts) {

                PdfTemplate template = contentByte.createTemplate(width, height);
                Graphics2D graphics2D = template.createGraphics(width, height);
                Rectangle2D rectangle2D = new Rectangle2D.Double(0, 0, width, height);

                chart.draw(graphics2D, rectangle2D);

                graphics2D.dispose();
                contentByte.addTemplate(template, 0, height - (height * index));
                index++;
            }

            writer.flush();
            document.close();

            return baos.toByteArray();
        } catch (Exception ex) {
            Logger.getLogger(ChartService.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

}