view artifacts/src/main/java/org/dive4elements/river/artifacts/states/DischargeState.java @ 9390:f575ff573cbb

"Name der Peilung" columname minfo.
author gernotbelger
date Thu, 09 Aug 2018 15:22:31 +0200
parents e4606eae8ea5
children
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.states;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.log4j.Logger;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.artifacts.common.model.KVP;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.model.DischargeZone;
import org.dive4elements.river.model.River;
import org.dive4elements.river.utils.RiverUtils;

public class DischargeState extends MultiIntArrayState {

    public static final String MAIN_CHANNEL = "main_channel";
    public static final String TOTAL_CHANNEL = "total_channel";

    private static final Logger log = Logger.getLogger(DischargeState.class);

    /** Let client display a matrix. */
    @Override
    public String getUIProvider() {
        return "parameter-matrix-flowvelocity";
    }

    /**
     * This method fetches all DischargeZones for a given river (extracted from
     * <i>artifact</i>) and returns a KVP[] where the key is the ID of the
     * DischargeZone and the value is a string that consists of lower discharge
     * and upper discharge.
     *
     * @param artifact
     *            Needs to be a D4EArtifact that provides river
     *            information.
     * @param parameterName
     *            The name of a parameter.
     *
     * @return a KVP[].
     */
    @Override
    protected KVP<Integer, String>[] getOptions(final Artifact artifact, final String parameterName) throws IllegalArgumentException {
        if (!testParameterName(parameterName)) {
            throw new IllegalArgumentException("Invalid parameter for state: '" + parameterName + "'");
        }

        final List<DischargeZone> zones = getDischargeZones(artifact);

        final KVP[] kvp = new KVP[zones.size()];

        Collections.sort(zones, new Comparator<DischargeZone>() {
            @Override
            public int compare(final DischargeZone a, final DischargeZone b) {
                return a.getValue().compareTo(b.getValue());
            }
        });

        int i = 0;

        for (final DischargeZone zone : zones) {
            final String lower = zone.getLowerDischarge();
            final String upper = zone.getUpperDischarge();

            if (lower.equals(upper)) {
                kvp[i] = new KVP(zone.getId(), lower);
            } else {
                kvp[i] = new KVP(zone.getId(), lower + " - " + upper);
            }
            i++;
        }

        return kvp;
    }

    @Override
    protected String getLabelFor(final CallContext cc, final String parameterName, final int value) throws IllegalArgumentException {
        if (!testParameterName(parameterName)) {
            throw new IllegalArgumentException("Invalid parameter for state: '" + parameterName + "'");
        }

        final DischargeZone zone = DischargeZone.getDischargeZoneById(value);

        if (zone == null) {
            throw new IllegalArgumentException("Invalid id for DischargeZone: '" + value + "'");
        }

        final String lo = zone.getLowerDischarge();
        final String hi = zone.getUpperDischarge();

        return hi != null && !lo.equals(hi) ? lo + " - " + hi : lo;
    }

    /**
     * This method might be used to test, if a parameter name is handled by this
     * state.
     *
     * @param parameterName
     *            The name of a parameter.
     *
     * @return true, if parameterName is one of <i>MAIN_CHANNEL</i> or
     *         <i>TOTAL_CHANNEL</i>. Otherwise false.
     */
    protected boolean testParameterName(final String parameterName) {
        if (parameterName == null || parameterName.length() == 0) {
            return false;
        } else if (parameterName.equals(MAIN_CHANNEL)) {
            return true;
        } else if (parameterName.equals(TOTAL_CHANNEL)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Returns all discharge zones for a given river. The river information is
     * extracted from <i>artifact</i> using RiverUtils.getRiver().
     *
     * @param artifact
     *            Needs to be a D4EArtifact that stores a rivername.
     *
     * @return a list of DischargeZones.
     *
     * @throws IllegalArgumentException
     *             if no river information is provided by
     *             <i>artifact</i>.
     */
    protected List<DischargeZone> getDischargeZones(final Artifact artifact) throws IllegalArgumentException {
        final River river = RiverUtils.getRiver((D4EArtifact) artifact);

        if (river == null) {
            throw new IllegalArgumentException("No river found");
        }

        final List<DischargeZone> zones = DischargeZone.getDischargeZones(river);

        log.debug("Found " + zones.size() + " DischargeZones.");

        return zones;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org