view flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java @ 4446:05a54b4d579d

Remove AbstractFixGenerator and use new KMIndexProcessor instead Don't use same base class for minfo and fixings artifacts. Instead use the new KMIndexProcessor to generate the same output for the same data types and facets.
author Björn Ricks <bjoern.ricks@intevation.de>
date Wed, 07 Nov 2012 14:34:13 +0100
parents 50273de4cf63
children b195fede1c3b
line wrap: on
line source
package de.intevation.flys.exports.fixings;

import au.com.bytecode.opencsv.CSVWriter;

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

import de.intevation.flys.artifacts.model.CalculationResult;

import de.intevation.flys.artifacts.model.fixings.AnalysisPeriod;
import de.intevation.flys.artifacts.model.fixings.FixAnalysisResult;
import de.intevation.flys.artifacts.model.fixings.QWD;

import de.intevation.flys.artifacts.resources.Resources;

import de.intevation.flys.exports.AbstractExporter;

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

import java.io.IOException;
import java.io.OutputStream;

import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.NumberFormat;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import org.w3c.dom.Document;

/** Exports fixation analysis deltaw(t) computation results to csv. */
public class DeltaWtExporter
extends      AbstractExporter
{
    /** Private logger. */
    private static Logger log = Logger.getLogger(DeltaWtExporter.class);

    public static final String CSV_KM_HEADER =
        "export.fixings.deltawt.csv.header.km";

    public static final String CSV_DELTA_W_HEADER =
        "export.fixings.deltawt.csv.header.deltaw";

    public static final String CSV_Q_HEADER =
        "export.fixings.deltawt.csv.header.q";

    public static final String CSV_W_HEADER =
        "export.fixings.deltawt.csv.header.w";

    public static final String CSV_TRANGE_HEADER =
        "export.fixings.deltawt.csv.header.time.range";

    public static final String CSV_T_HEADER =
        "export.fixings.deltawt.csv.header.t";

    public static final String CSV_T_FORMAT =
        "export.fixings.deltawt.csv.t.format";

    public static final String DEFAULT_CSV_KM_HEADER = "km";

    public static final String DEFAULT_CSV_DELTA_W_HEADER = "\u0394 W [cm]";

    public static final String DEFAULT_CSV_W_HEADER = "Wasserstand [m]";

    public static final String DEFAULT_CSV_Q_HEADER = "Abfluss [m\u00b3/s]";

    public static final String DEFAULT_CSV_T_HEADER = "Datum";

    public static final String DEFAULT_CSV_TRANGE_DESC_HEADER =
        "Status";

    public static final String CSV_REFERENCE =
        "export.fixings.deltawt.csv.reference";

    public static final String CSV_ANALYSIS =
        "export.fixings.deltawt.csv.analysis";

    public static final String DEFAULT_CSV_REFERENCE =
        "B";

    public static final String DEFAULT_CSV_ANALYSIS =
        "A{0,number,integer}";

    public static final String DEFAULT_CSV_T_FORMAT =
        "dd.MM.yyyy";

    protected List<KMIndex<AnalysisPeriod []>> analysisPeriods;

    protected List<KMIndex<QWD[]>> referenceEvents;

    @Override
    public void init(Document request, OutputStream out, CallContext context) {
        log.debug("DeltaWtExporter.init");
        super.init(request, out, context);
        analysisPeriods = new ArrayList<KMIndex<AnalysisPeriod []>>();
        referenceEvents = new ArrayList<KMIndex<QWD[]>>();
    }

    @Override
    protected void addData(Object d) {
        log.debug("DeltaWtExporter.addData");
        if (!(d instanceof CalculationResult)) {
            log.warn("Invalid data type");
            return;
        }

        Object data = ((CalculationResult)d).getData();
        if (!(data instanceof FixAnalysisResult)) {
            log.warn("Invalid data stored in result.");
        }
        FixAnalysisResult result = (FixAnalysisResult)data;
        analysisPeriods.add(result.getAnalysisPeriods());
        referenceEvents.add(result.getReferenced());
    }

    @Override
    protected void writeCSVData(CSVWriter writer) throws IOException {

        boolean debug = log.isDebugEnabled();

        writeCSVHeader(writer);

        NumberFormat kmF = getKMFormatter();
        NumberFormat dwF = getDeltaWFormatter();
        NumberFormat qF  = getQFormatter();
        NumberFormat wF  = getWFormatter();

        DateFormat dF = getDateFormatter();

        String referenceS = getReference();

        for (KMIndex<QWD[]> reference: referenceEvents) {

            for (KMIndex.Entry<QWD[]> kmEntry: reference) {

               String kmS = kmF.format(kmEntry.getKm());
               for (QWD qwd: kmEntry.getValue()) {
                    String deltaWS = dwF.format(qwd.getDeltaW());
                    String qS      = qF.format(qwd.getQ());
                    String wS      = wF.format(qwd.getW());
                    String dateS   = dF.format(qwd.getDate());

                    writer.writeNext(new String[] {
                        kmS,
                        dateS,
                        qS,
                        wS,
                        referenceS,
                        deltaWS
                        });
               }
            }
        }

        if (debug) {
            log.debug("AnalysisPeriods: " + analysisPeriods.size());
        }

        String analysisTemplate = getAnalysisTemplate();

        for (KMIndex<AnalysisPeriod []> periods: analysisPeriods) {

            for (KMIndex.Entry<AnalysisPeriod []> kmEntry: periods) {
            
                String kmS = kmF.format(kmEntry.getKm());
                int analysisCount = 1;

                for (AnalysisPeriod period: kmEntry.getValue()) {
                    // Typically resulting in A1,A2...
                    String analyisS = MessageFormat.format(analysisTemplate,
                        analysisCount);
                    QWD [] qwds = period.getQWDs();

                    if (qwds != null) {
                        for (QWD qwd: qwds) {
                            String deltaWS = dwF.format(qwd.getDeltaW());
                            String qS      = qF.format(qwd.getQ());
                            String wS      = wF.format(qwd.getW());
                            String dateS   = dF.format(qwd.getDate());

                            writer.writeNext(new String[] {
                                kmS,
                                dateS,
                                qS,
                                wS,
                                analyisS,
                                deltaWS });
                        }
                    }
                    ++analysisCount;
                }
            }
        }
        writer.flush();
    }

    /** Template to create "State" strings like A1,A2... */
    protected String getAnalysisTemplate() {
        return Resources.getMsg(
            context.getMeta(),
            CSV_ANALYSIS, DEFAULT_CSV_ANALYSIS);
    }

    protected String getReference() {
        return Resources.getMsg(
            context.getMeta(),
            CSV_REFERENCE, DEFAULT_CSV_REFERENCE);
    }

    protected NumberFormat getKMFormatter() {
        return Formatter.getFixDeltaWKM(context);
    }

    protected NumberFormat getDeltaWFormatter() {
        return Formatter.getFixDeltaWDeltaW(context);
    }

    protected NumberFormat getQFormatter() {
        return Formatter.getFixDeltaWQ(context);
    }

    protected NumberFormat getWFormatter() {
        return Formatter.getFixDeltaWW(context);
    }

    protected DateFormat getDateFormatter() {
        CallMeta meta = context.getMeta();
        return Formatter.getDateFormatter(
            meta,
            Resources.getMsg(
                meta,
                CSV_T_FORMAT,
                DEFAULT_CSV_T_FORMAT));
    }

    protected void writeCSVHeader(CSVWriter writer) {
        log.debug("DeltaWtExporter.writeCSVHeader");

        /* issue825
        km; Ereignis, Abfluss, GEMESSENER Wasserstand; Status (RECHTSBÜNDIG), del W
        */

        writer.writeNext(new String[] {
            msg(CSV_KM_HEADER,      DEFAULT_CSV_KM_HEADER),
            msg(CSV_T_HEADER,       DEFAULT_CSV_T_HEADER),
            msg(CSV_Q_HEADER,       DEFAULT_CSV_Q_HEADER),
            msg(CSV_W_HEADER,       DEFAULT_CSV_W_HEADER),
            msg(CSV_TRANGE_HEADER,  DEFAULT_CSV_TRANGE_DESC_HEADER),
            msg(CSV_DELTA_W_HEADER, DEFAULT_CSV_DELTA_W_HEADER)
        });
    }

    @Override
    protected void writePDF(OutputStream out) {
        // TODO: Implement me!
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org