view artifacts/src/main/java/org/dive4elements/river/exports/WaterlevelDescriptionBuilder.java @ 8933:05b5588bdd94

Extracting some winfo logic without breaking old code
author gernotbelger
date Tue, 06 Mar 2018 17:05:13 +0100
parents
children 5294114b1df4
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.exports;

import java.text.NumberFormat;

import org.dive4elements.artifacts.CallContext;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.WINFOArtifact;
import org.dive4elements.river.artifacts.model.WQKms;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.utils.Formatter;
import org.dive4elements.river.utils.RiverUtils;
import org.dive4elements.river.utils.RiverUtils.WQ_MODE;

/**
 * Helper that encapsulates the logic how the 'description' column in waterlevel exporting is generated.
 * TODO: this class should also be used in WaterlevelExport (all code is copied from there), but this would involve
 * heavy testing and we leave this to the one who is responsible to clean up this mess.
 *
 * @author Gernot Belger
 */
public final class WaterlevelDescriptionBuilder {

    private static final String CSV_Q_DESC_HEADER = "export.waterlevel.csv.header.q.desc";

    // FIXME: missing in resource-files! hence always the default is used...
    private static final String CSV_W_DESC_HEADER = "export.waterlevel.csv.header.w.desc";

    private static final String DEFAULT_CSV_Q_DESC_HEADER = "Bezeichnung";

    private static final String DEFAULT_CSV_W_DESC_HEADER = "W/Pegel [cm]";

    private final boolean isQ;

    private final boolean atGauge;

    private final CallContext context;

    private final WQ_MODE mode;

    private final D4EArtifact artifact;

    public WaterlevelDescriptionBuilder(final D4EArtifact artifact, final CallContext context) {
        this.context = context;

        // REMARK: taken from WaterlevelExporter, should be moved into WInfoArtifact
        this.mode = RiverUtils.getWQMode(artifact);
        this.atGauge = this.mode == WQ_MODE.QGAUGE || this.mode == WQ_MODE.WGAUGE;
        this.isQ = this.mode == WQ_MODE.QGAUGE || this.mode == WQ_MODE.QFREE;

        this.artifact = artifact;
    }

    public boolean isAtGauge() {
        return this.atGauge;
    }

    public String getColumnHeader() {

        if (!this.atGauge)
            return null;

        // REMARK: bad inter-dependency to WaterlevelExporter, but we want to really copy the logic from WInfo
        if (this.isQ)
            return Resources.getMsg(this.context.getMeta(), CSV_Q_DESC_HEADER, DEFAULT_CSV_Q_DESC_HEADER);

        return Resources.getMsg(this.context.getMeta(), CSV_W_DESC_HEADER, DEFAULT_CSV_W_DESC_HEADER);
    }

    public String getDesc(final WQKms wqkms) {
        return getDesc(wqkms, this.isQ);
    }

    public String getDesc(final WQKms wqkms, final boolean isQoverride) {
        String colDesc = "";

        if (this.artifact instanceof WINFOArtifact && isQoverride) {
            colDesc = getCSVRowTitle((WINFOArtifact) this.artifact, wqkms);
        } else if (!isQoverride) {
            final Double value = RiverUtils.getValueFromWQ(wqkms);
            colDesc = (value != null) ? Formatter.getWaterlevelW(this.context).format(value) : null;
        }

        if (this.artifact instanceof WINFOArtifact) {
            if (wqkms != null && wqkms.getRawValue() != null) {
                final WINFOArtifact winfo = (WINFOArtifact) this.artifact;
                colDesc = RiverUtils.getNamedMainValue(winfo, wqkms.getRawValue());
                // For 'W am Pegel' s
                if (colDesc == null) {
                    final Double value = RiverUtils.getValueFromWQ(wqkms);
                    colDesc = (value != null) ? Formatter.getWaterlevelW(this.context).format(value) : null;
                }
            }
        }

        if (colDesc == null)
            return "";

        /*
         * Quick hack. Can be removed when database strings are
         * adapted or left in here as it should never be harmful.
         */
        return colDesc.replace("Amtl.Festlegung_", "Amtl. ");
    }

    private String getCSVRowTitle(final WINFOArtifact winfo, final WQKms wqkms) {

        if (this.mode == WQ_MODE.WFREE || this.mode == WQ_MODE.QGAUGE)
            return localizeWQKms(wqkms);

        final Double v = wqkms.getRawValue();

        final String nmv = RiverUtils.getNamedMainValue(winfo, v);

        if (nmv != null && nmv.length() > 0) {
            return RiverUtils.stripNamedMainValue(nmv);
        }

        return localizeWQKms(wqkms);
    }

    /**
     * Get a string like 'W=' or 'Q=' with a number following in localized
     * format.
     */
    private String localizeWQKms(final WQKms wqkms) {
        final Double rawValue = wqkms.getRawValue();

        if (rawValue == null) {
            return wqkms.getName();
        }

        final NumberFormat nf = Formatter.getRawFormatter(this.context);

        if (this.mode == WQ_MODE.WFREE || this.mode == WQ_MODE.WGAUGE)
            return "W=" + nf.format(rawValue);

        return "Q=" + nf.format(rawValue);
    }
}

http://dive4elements.wald.intevation.org