view artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResult.java @ 9406:55e3b1a8aa06

salix pdf export column added
author gernotbelger
date Wed, 15 Aug 2018 15:10:01 +0200
parents 6e7094368e97
children b6e595f1696f
line wrap: on
line source
/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
 * Software engineering by
 *  Björnsen Beratende Ingenieure GmbH
 *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
 *
 * 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.uinfo.salix;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult;
import org.dive4elements.river.artifacts.common.AbstractExportContext;
import org.dive4elements.river.artifacts.common.ExportContextCSV;
import org.dive4elements.river.artifacts.common.ExportContextPDF;
import org.dive4elements.river.artifacts.common.GeneralResultType;
import org.dive4elements.river.artifacts.common.IExportContext;
import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
import org.dive4elements.river.artifacts.common.ResultRow;
import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType;

import gnu.trove.TDoubleArrayList;

/**
 * @author Domenico Nardi Tironi
 */
class SalixLineCalculationResult extends AbstractCalculationExportableResult {

    private static final long serialVersionUID = 1L;
    private static final String JASPER_FILE = "/jasper/templates/uinfo.salixline.jrxml";

    private final String[] scenarioLabels;

    private final String partialRangeString;

    private final String deltaWString;

    public SalixLineCalculationResult(final String label, final Collection<ResultRow> rows) {
        this(label, new String[] {}, "", "", rows);
    }

    public SalixLineCalculationResult(final String label, final String[] scenarioLabels, final String partialRangeString, final String deltaWString,
            final Collection<ResultRow> rows) {
        super(label, rows);
        this.scenarioLabels = scenarioLabels;
        this.partialRangeString = partialRangeString;
        this.deltaWString = deltaWString;
    }

    public final int getScenarioCount() {
        return (this.scenarioLabels != null) ? this.scenarioLabels.length : 0;
    }

    public String getScenarioLabel(final int i) {
        if ((this.scenarioLabels != null) && (i < this.scenarioLabels.length))
            return this.scenarioLabels[i];

        return "";
    }

    public String getPartialRangeString() {
        return this.partialRangeString;
    }

    public String getDeltaWString() {
        return this.deltaWString;
    }

    @Override
    public void writeCSVHeader(final ExportContextCSV exportContextCSV, final RiverInfo river) {

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

        header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station));
        header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salixline));
        header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salix_mw_mnw));

        for (int i = 1; i <= getScenarioCount(); i++) {
            header.add(exportContextCSV.msg(SalixScenario.getDeltaWHeader()));
            header.add(exportContextCSV.msg(SalixScenario.getScenarioValueHeader()));
        }
        header.add(exportContextCSV.formatCsvHeader(GeneralResultType.gaugeLabel));
        exportContextCSV.writeCSVLine(header.toArray(new String[header.size()]));
    }

    @Override
    protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final ResultRow row) {
        return formatRow(exportContextCSV, row);
    }

    @Override
    protected String[] formatPDFRow(final ExportContextPDF exportContextPDF, final ResultRow row) {
        return formatRow(exportContextPDF, row);
    }

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

    @Override
    protected void addJRTableHeader(final ExportContextPDF exportContextPDF, final MetaAndTableJRDataSource source) {

        /* additional column headings */
        exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station);
        exportContextPDF.addJRMetadata(source, "salix_line", UInfoResultType.salixline);
        exportContextPDF.addJRMetadata(source, "salix_delta_mw", UInfoResultType.salix_mw_mnw);

        for (int i = 1; i <= this.getScenarioCount(); i++) {
            // TODO Spaltenueberschriften der Scenarios (falls gefordert)
        }
        exportContextPDF.addJRMetadata(source, "gauge_header", GeneralResultType.gaugeLabel);
    }

    private String[] formatRow(final IExportContext context, final ResultRow row) {

        final Collection<String> lines = new ArrayList<>();
        lines.add(context.formatRowValue(row, GeneralResultType.station));
        lines.add(context.formatRowValue(row, UInfoResultType.salixline));
        lines.add(context.formatRowValue(row, UInfoResultType.salix_mw_mnw));

        if (context instanceof ExportContextCSV) {
            final NumberFormat formatter = ((AbstractExportContext) context).getSalixScenFormatter();
            final List<SalixScenario> scenarios = (List<SalixScenario>) row.getValue(UInfoResultType.customMultiRowColSalixScenarios);
            for (int i = 1; i <= this.getScenarioCount(); i++) {
                if (i > scenarios.size())
                    break;
                if (scenarios.get(i - 1) != null) {
                    lines.add(scenarios.get(i - 1).getDeltaWFormatted());
                    lines.add(scenarios.get(i - 1).getSalixValueFormatted(formatter));
                } else {
                    lines.add("");
                    lines.add("");
                }
            }
        }
        lines.add(context.formatRowValue(row, GeneralResultType.gaugeLabel));
        return lines.toArray(new String[lines.size()]);
    }

    @Override
    protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV) {
        // do nothing. subclass may override
    }

    /**
     * Gets a longitudinal section of the salix value of a scenario
     */
    public final double[][] getScenarioPoints(final int dataIndex) {

        final Collection<ResultRow> rows = getRows();

        final TDoubleArrayList xPoints = new TDoubleArrayList(rows.size());
        final TDoubleArrayList yPoints = new TDoubleArrayList(rows.size());

        for (final ResultRow row : rows) {

            final double station = row.getDoubleValue(GeneralResultType.station);

            final List<SalixScenario> scenarios = (List<SalixScenario>) row.getValue(UInfoResultType.customMultiRowColSalixScenarios);
            if (dataIndex <= scenarios.size() - 1) {
                final SalixScenario salixScenario = scenarios.get(dataIndex);
                if (salixScenario != null) {
                    final double value = salixScenario.getSalixValue();
                    xPoints.add(station);
                    yPoints.add(value);
                }
            }
        }

        return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
    }
}

http://dive4elements.wald.intevation.org