view flys-artifacts/src/main/java/de/intevation/flys/exports/WDifferencesExporter.java @ 4255:670e98f5a441

Fixed leak while merging facets. The ThemeList that is used by OutputHelper to sort the Facets for an Output now uses a list to store the ManagedFacets. The correct order is made up by sorting the List using Collections.sort() function of the Java JDK. Therfore, the ManagedFacet class implements the Comparable interface. The return value of its compareTo(other) method depends on the value of the 'position' field.
author Ingo Weinzierl <weinzierl.ingo@googlemail.com>
date Thu, 25 Oct 2012 14:01:46 +0200
parents b2ea89a665bc
children
line wrap: on
line source
package de.intevation.flys.exports;

import java.io.IOException;
import java.io.OutputStream;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Date;
import java.text.DateFormat;
import java.util.Locale;

import org.w3c.dom.Document;

import org.apache.log4j.Logger;

import au.com.bytecode.opencsv.CSVWriter;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JRException;

import de.intevation.artifacts.CallContext;
import de.intevation.artifacts.CallMeta;
import de.intevation.artifacts.common.utils.Config;

import de.intevation.flys.artifacts.WINFOArtifact;

import de.intevation.flys.artifacts.model.CalculationResult;
import de.intevation.flys.artifacts.model.WKms;
import de.intevation.flys.artifacts.model.WKmsJRDataSource;
import de.intevation.flys.artifacts.resources.Resources;

import de.intevation.flys.utils.FLYSUtils;
import de.intevation.flys.utils.Formatter;

/**
 * (CSV)Exporter for WDifferences.
 */
public class WDifferencesExporter extends AbstractExporter {

    /** The logger used in this exporter. */
    private static Logger logger = Logger.getLogger(WDifferencesExporter.class);


    public static final String WDIFF_CSV_KM_HEADER =
        "export.w_differences.csv.header.km";

    public static final String WDIFF_CSV_W_HEADER =
        "export.w_differences.csv.header.w";

    public static final String WDIFF_DEFAULT_CSV_KM_HEADER = "Fluss-Km";
    public static final String WDIFF_DEFAULT_CSV_W_HEADER  = "m";

    public static final String PDF_HEADER_MODE = "export.wdifferences.pdf.mode";
    public static final String JASPER_FILE = "export.wdifferences.pdf.file";

    /** The storage that contains all WKms objects for the different facets. */
    protected List<WKms[]> data;


    public void init(Document request, OutputStream out, CallContext context) {
        logger.debug("WDifferencesExporter.init");

        super.init(request, out, context);

        this.data = new ArrayList<WKms[]>();
    }


    /**
     * Genereate data in csv format.
     */
    @Override
    public void generate()
    throws IOException
    {
        logger.debug("WDifferencesExporter.generate");

        if (facet == null) {
            throw new IOException("invalid (null) facet for exporter");
        }
        else if (facet.equals(AbstractExporter.FACET_CSV)) {
            generateCSV();
        }
        else if (facet.equals(AbstractExporter.FACET_PDF)) {
            generatePDF();
        }
        else {
            throw new IOException("invalid facet (" + facet + ") for exporter");
        }
    }


    /**
     * Adds given data.
     * @param d either a WKms or a CalculationResult to add to data.
     */
    @Override
    protected void addData(Object d) {
        if (d instanceof CalculationResult) {
            d = ((CalculationResult)d).getData();
            if (d instanceof WKms []) {
                data.add((WKms [])d);
            }
        }
        else if (d instanceof WKms) {
            data.add(new WKms[] { (WKms) d });
        }
    }


    /**
     * Lets writer write all data (including header).
     * @param writer Writer to write data with.
     */
    @Override
    protected void writeCSVData(CSVWriter writer) {
        logger.info("WDifferencesExporter.writeData");

        writeCSVHeader(writer);

        for (WKms[] tmp: data) {
            for (WKms wkms: tmp) {
                wKms2CSV(writer, wkms);
            }
        }
    }


    /**
     * Lets csvwriter write the header (first line in file).
     * @param writer Writer to write header with.
     */
    protected void writeCSVHeader(CSVWriter writer) {
        logger.info("WDifferencesExporter.writeCSVHeader");

        writer.writeNext(new String[] {
            msg(WDIFF_CSV_KM_HEADER, WDIFF_DEFAULT_CSV_KM_HEADER),
            msg(WDIFF_CSV_W_HEADER, WDIFF_DEFAULT_CSV_W_HEADER)
        });
    }


    protected void wKms2CSV(CSVWriter writer, WKms wkms) {
        logger.debug("WDifferencesExporter.wKms2CSV");

        NumberFormat kmf  = getKmFormatter();
        NumberFormat wf   = getWFormatter();
        int          size = wkms.size();

        for (int i = 0; i < size; i ++) {

            writer.writeNext(new String[] {
                kmf.format(wkms.getKm(i)),
                wf.format(wkms.getW(i))
            });
        }
    }


    /**
     * Returns the number formatter for kilometer values.
     *
     * @return the number formatter for kilometer values.
     */
    protected NumberFormat getKmFormatter() {
        return Formatter.getWaterlevelKM(context);
    }


    /**
     * Returns the number formatter for W values.
     *
     * @return the number formatter for W values.
     */
    protected NumberFormat getWFormatter() {
        return Formatter.getWaterlevelW(context);
    }


    @Override
    protected void writePDF(OutputStream out) {
        WKmsJRDataSource source = createJRData();

        String jasperFile = Resources.getMsg(
                                context.getMeta(),
                                JASPER_FILE,
                                "/jasper/wdifferences_en.jasper");
        String confPath = Config.getConfigDirectory().toString();

        Map parameters = new HashMap();
        parameters.put("ReportTitle", "Exported Data");
        try {
            JasperPrint print = JasperFillManager.fillReport(
                confPath + jasperFile,
                parameters,
                source);
            JasperExportManager.exportReportToPdfStream(print, out);
        }
        catch(JRException je) {
            logger.warn("Error generating PDF Report!");
            je.printStackTrace();
        }
    }

    protected WKmsJRDataSource createJRData() {
        WKmsJRDataSource source = new WKmsJRDataSource();

        addMetaData(source);
        for (WKms[] tmp: data) {
            for (WKms wkms: tmp) {
                addWKmsData(source, wkms);
            }
        }
        return source;
    }


    protected void addMetaData(WKmsJRDataSource source) {
        CallMeta meta = context.getMeta();

        WINFOArtifact flys = (WINFOArtifact) master;

        source.addMetaData ("river", FLYSUtils.getRivername(flys));

        Locale locale = Resources.getLocale(meta);
        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);

        source.addMetaData("date", df.format(new Date()));

        String differences = FLYSUtils.getWDifferences(flys, context);
        source.addMetaData("differences", differences);

        source.addMetaData("calculation", Resources.getMsg(
                                            locale,
                                            PDF_HEADER_MODE,
                                            "W Differences"));
    }

    protected void addWKmsData(WKmsJRDataSource source, WKms wkms) {
        NumberFormat kmf  = getKmFormatter();
        NumberFormat wf   = getWFormatter();
        int          size = wkms.size();

        for (int i = 0; i < size; i ++) {

            source.addData(new String[] {
                kmf.format(wkms.getKm(i)),
                wf.format(wkms.getW(i))
            });
        }
    }

}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org