view artifacts/src/main/java/org/dive4elements/river/exports/fixings/DeltaWtExporter.java @ 9082:42c15e2f95fb

2.3.4.1.4 Wasserstand falsche Einheit FixAnalysis PDF start
author gernotbelger
date Fri, 25 May 2018 10:44:24 +0200
parents 5e38e2924c07
children 8024e51e828a
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.exports.fixings;

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 java.util.TreeMap;

import org.apache.log4j.Logger;
import org.dive4elements.artifacts.CallMeta;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.access.RiverAccess;
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.model.fixings.AnalysisPeriod;
import org.dive4elements.river.artifacts.model.fixings.FixAnalysisResult;
import org.dive4elements.river.artifacts.model.fixings.QWD;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.exports.AbstractExporter;
import org.dive4elements.river.utils.Formatter;
import org.dive4elements.river.utils.KMIndex;

import au.com.bytecode.opencsv.CSVWriter;

/** Exports fixation analysis deltaw(t) computation results to csv. */
public class DeltaWtExporter extends AbstractExporter {
    /** Private log. */
    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;

    public DeltaWtExporter() {
        this.analysisPeriods = new ArrayList<>();
        this.referenceEvents = new ArrayList<>();
    }

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

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

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

        final boolean debug = log.isDebugEnabled();

        writeCSVHeader(writer);

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

        final DateFormat dF = getDateFormatter();

        final TreeMap<Double, ArrayList<String[]>> sorted = new TreeMap<>();

        final String referenceS = getReference();

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

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

                final Double km = kmEntry.getKm();

                ArrayList<String[]> list = sorted.get(km);

                if (list == null) {
                    list = new ArrayList<>();
                    sorted.put(km, list);
                }

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

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

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

        final String analysisTemplate = getAnalysisTemplate();

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

            for (final KMIndex.Entry<AnalysisPeriod[]> kmEntry : periods) {

                final Double km = kmEntry.getKm();

                ArrayList<String[]> list = sorted.get(km);

                if (list == null) {
                    list = new ArrayList<>();
                    sorted.put(km, list);
                }

                final String kmS = kmF.format(kmEntry.getKm());
                int analysisCount = 1;

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

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

                            list.add(new String[] { kmS, dateS, qS, wS, analyisS, deltaWS });
                        }
                    }
                    ++analysisCount;
                }
            }
        }

        for (final ArrayList<String[]> list : sorted.values()) {
            for (final String[] row : list) {
                writer.writeNext(row);
            }
        }

        writer.flush();
    }

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

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

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

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

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

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

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

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

        /*
         * issue825
         * km; Ereignis, Abfluss, GEMESSENER Wasserstand;
         * Status (RECHTSBÜNDIG), del W
         */
        final RiverAccess river = new RiverAccess((D4EArtifact) this.master);
        final String unit = river.getRiver().getWstUnit().getName();

        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, new Object[] { unit }),
                msg(CSV_TRANGE_HEADER, DEFAULT_CSV_TRANGE_DESC_HEADER), msg(CSV_DELTA_W_HEADER, DEFAULT_CSV_DELTA_W_HEADER) });
    }

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

http://dive4elements.wald.intevation.org