view flys-artifacts/src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveExporter.java @ 2258:ea173e4c07c7

Added a CSV export for historical discharge curves. flys-artifacts/trunk@3913 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 06 Feb 2012 08:36:26 +0000
parents
children 89ca1e8572e4
line wrap: on
line source
package de.intevation.flys.exports;

import java.io.OutputStream;
import java.text.NumberFormat;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.w3c.dom.Document;

import org.apache.log4j.Logger;

import au.com.bytecode.opencsv.CSVWriter;

import de.intevation.artifacts.CallContext;
import de.intevation.artifacts.CallMeta;

import de.intevation.flys.artifacts.FLYSArtifact;
import de.intevation.flys.artifacts.model.CalculationResult;
import de.intevation.flys.artifacts.model.Timerange;
import de.intevation.flys.artifacts.model.WQTimerange;
import de.intevation.flys.artifacts.resources.Resources;
import de.intevation.flys.utils.FLYSUtils;
import de.intevation.flys.utils.Formatter;


/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class HistoricalDischargeCurveExporter extends AbstractExporter {

    private static final Logger logger =
        Logger.getLogger(HistoricalDischargeCurveExporter.class);


    public static final String CSV_TIMERANGE_HEADER =
        "export.historical.discharge.csv.header.timerange";

    public static final String CSV_WATERLEVEL_HEADER =
        "export.historical.discharge.csv.header.waterlevel";

    public static final String CSV_DISCHARGE_HEADER =
        "export.historical.discharge.csv.header.discharge";

    public static final String CSV_DIFF_HEADER =
        "export.historical.discharge.csv.header.diff";

    public static final String CSV_GAUGENAME_HEADER =
        "export.historical.discharge.csv.header.gaugename";


    protected List<WQTimerange[]> data;


    public void init(Document request, OutputStream out, CallContext cc) {
        super.init(request, out, cc);

        data = new ArrayList<WQTimerange[]>();
    }


    @Override
    protected void addData(Object d) {
        logger.debug("Add data of class: " + d.getClass());

        if (d instanceof CalculationResult) {
            d = ((CalculationResult) d).getData();

            logger.debug("Internal data of CalculationResult: " + d.getClass());

            if (d instanceof WQTimerange[]) {
                logger.debug("Add new data of type WQTimerange");
                data.add((WQTimerange[]) d);
            }
        }
    }


    @Override
    protected void writeCSVData(CSVWriter writer) {
        logger.info("HistoricalDischargeCurveExporter.writeCSVData");
        logger.debug("CSV gets " + data.size() + " WQTimerange[] objects.");

        writeCSVHeader(writer);

        for (WQTimerange[] arr: data) {
            for (WQTimerange wqt: arr) {
                wqt2CSV(writer, wqt);
            }
        }
    }


    @Override
    protected void writePDF(OutputStream out) {
        logger.warn("TODO: IMPLEMENT ME!");
    }


    protected void writeCSVHeader(CSVWriter writer) {
        writer.writeNext(new String[] {
            msg(CSV_TIMERANGE_HEADER, CSV_TIMERANGE_HEADER),
            msg(CSV_WATERLEVEL_HEADER, CSV_WATERLEVEL_HEADER),
            msg(CSV_DISCHARGE_HEADER, CSV_DISCHARGE_HEADER),
            msg(CSV_DIFF_HEADER, CSV_DIFF_HEADER),
            msg(CSV_GAUGENAME_HEADER, CSV_GAUGENAME_HEADER)
        });
    }


    protected void wqt2CSV(CSVWriter writer, WQTimerange wqt) {
        logger.debug("Add next WQTimerange to CSV");

        DateFormat   df = Formatter.getShortDateFormat(context);
        NumberFormat wf = Formatter.getHistoricalDischargeW(context);
        NumberFormat qf = Formatter.getHistoricalDischargeQ(context);

        double[] wq = new double[2];

        String gaugeName = getReferenceGaugename();

        for (int i = 0, n = wqt.size(); i < n; i++) {
            Timerange tr = wqt.getTimerange(i);
            Date   start = new Date(tr.getStart());
            Date     end = new Date(tr.getEnd());

            wqt.get(i, wq);

            writer.writeNext(new String[] {
                df.format(start) + " - " + df.format(end),
                wf.format(wq[0]),
                qf.format(wq[1]),
                "TODO: Difference to reference curve",
                gaugeName
            });
        }
    }


    public String getReferenceGaugename() {
        return FLYSUtils.getReferenceGaugeName((FLYSArtifact) master);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org