view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java @ 8980:b194fa64506a

SINFO - show results themes according to spec, either raw data or floating mean values. Some improvements to error handling and handling of empty results.
author gernotbelger
date Thu, 05 Apr 2018 18:30:34 +0200
parents 183f42641ab6
children d5802f22e4f5
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.artifacts.sinfo.flowdepth;

import java.util.ArrayList;
import java.util.Collection;

import org.apache.log4j.Logger;
import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter;
import org.dive4elements.river.artifacts.sinfo.common.SInfoResultRow;
import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo;
import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource;
import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
import org.dive4elements.river.artifacts.sinfo.util.WstInfo;

import au.com.bytecode.opencsv.CSVWriter;

/**
 * Generates different output formats (csv, pdf) of data that resulted from a flow depths min/max computation.
 *
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 * @author Gernot Belger
 */
// REMARK: must be public because its registered in generators.xml
public class FlowDepthExporter extends AbstractSInfoExporter<FlowDepthCalculationResult, FlowDepthCalculationResults> {

    private static enum ExportMode {
        pdf, csv
    }

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

    private static final String JASPER_FILE = "/jasper/sinfo.flowdepth.jasper";

    @Override
    protected Logger getLog() {
        return log;
    }

    @Override
    protected void writeCSVGlobalMetadata(final CSVWriter writer, final FlowDepthCalculationResults results) {
        log.info("FlowDepthExporter.writeCSVMeta");

        super.writeCSVGlobalMetadataDefaults(writer, results);

        writer.writeNext(new String[] { "" });
    }

    @Override
    protected void writeCSVResultMetadata(final CSVWriter writer, final FlowDepthCalculationResults results, final FlowDepthCalculationResult result) {

        final BedHeightInfo sounding = result.getSounding();
        super.writeCSVSoundingMetadata(writer, sounding);

        final WstInfo wst = result.getWst();
        super.writeCSVWaterlevelMetadata(writer, wst);
    }

    /**
     * Write the header, with different headings depending on whether at a
     * gauge or at a location.
     *
     * @param river
     * @param useTkh
     */
    @Override
    protected void writeCSVHeader(final CSVWriter writer, final FlowDepthCalculationResults results, final RiverInfo river) {
        log.info("FlowDepthExporter.writeCSVHeader");

        final Collection<String> header = new ArrayList<>(11);

        header.add(msg(SInfoResultType.station.getCsvHeader()));
        header.add(msgUnit(SInfoResultType.flowdepth.getCsvHeader(), SInfoResultType.flowdepth.getUnit()));

        if (results.isUseTkh()) {
            header.add(msgUnit(SInfoResultType.flowdepthtkh.getCsvHeader(), SInfoResultType.flowdepthtkh.getUnit()));
            header.add(msgUnit(SInfoResultType.tkh.getCsvHeader(), SInfoResultType.tkh.getUnit()));
        }

        header.add(msgUnit(SInfoResultType.waterlevel.getCsvHeader(), river.getWstUnit()));
        header.add(msgUnit(SInfoResultType.discharge.getCsvHeader(), SInfoResultType.discharge.getUnit()));
        header.add(msg(SInfoResultType.waterlevelLabel.getCsvHeader()));
        header.add(msg(SInfoResultType.gaugeLabel.getCsvHeader()));
        header.add(msgUnit(SInfoResultType.meanBedHeight.getCsvHeader(), river.getWstUnit()));
        header.add(msg(SInfoResultType.soundingLabel.getCsvHeader()));
        header.add(msg(SInfoResultType.location.getCsvHeader()));

        writer.writeNext(header.toArray(new String[header.size()]));
    }

    @Override
    protected String[] formatCSVRow(final FlowDepthCalculationResults results, final FlowDepthCalculationResult result, final SInfoResultRow row) {
        return formatRow(row, ExportMode.csv);
    }

    /**
     * Format a row of a flow depth result into an array of string, both used by csv and pdf
     *
     * @param pdf
     *
     * @param useTkh
     */
    private String[] formatRow(final SInfoResultRow row, final ExportMode mode) {

        final Collection<String> lines = new ArrayList<>(11);

        lines.add(row.exportValue(this.context, SInfoResultType.station));
        lines.add(row.exportValue(this.context, SInfoResultType.flowdepth));

        if (mode == ExportMode.pdf || getData().isUseTkh()) {
            lines.add(row.exportValue(this.context, SInfoResultType.flowdepthtkh));
            lines.add(row.exportValue(this.context, SInfoResultType.tkh));
        }

        lines.add(row.exportValue(this.context, SInfoResultType.waterlevel));
        lines.add(row.exportValue(this.context, SInfoResultType.discharge));
        lines.add(row.exportValue(this.context, SInfoResultType.waterlevelLabel));
        lines.add(row.exportValue(this.context, SInfoResultType.gaugeLabel));
        lines.add(row.exportValue(this.context, SInfoResultType.meanBedHeight));
        lines.add(row.exportValue(this.context, SInfoResultType.soundingLabel));
        lines.add(row.exportValue(this.context, SInfoResultType.location));

        return lines.toArray(new String[lines.size()]);
    }

    @Override
    protected final String getJasperFile() {
        return JASPER_FILE;
    }

    @Override
    protected final void addJRMetaData(final MetaAndTableJRDataSource source, final FlowDepthCalculationResults results) {

        /* general metadata */
        super.addJRMetaDataDefaults(source, results);

        /* column headings */
        source.addMetaData("station_header", SInfoResultType.station.getPdfHeader(this.context.getMeta()));
        source.addMetaData("flowdepth_header", SInfoResultType.flowdepth.getPdfHeader(this.context.getMeta()));
        source.addMetaData("flowdepth_tkh_header", SInfoResultType.flowdepthtkh.getPdfHeader(this.context.getMeta()));
        source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta()));
        source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta()));
        source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta()));
        source.addMetaData("waterlevel_name_header", SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta()));
        source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta()));
        source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta()));
        source.addMetaData("sounding_name_header", SInfoResultType.soundingLabel.getPdfHeader(this.context.getMeta()));
        source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta()));
    }

    @Override
    protected String[] formatPDFRow(final FlowDepthCalculationResults results, final SInfoResultRow row) {
        return formatRow(row, ExportMode.pdf);
    }
}

http://dive4elements.wald.intevation.org