view flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/DischargeState.java @ 4031:e4e345d81a65

issue889/2
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Thu, 04 Oct 2012 14:54:44 +0200
parents 208a891c21b5
children
line wrap: on
line source
package de.intevation.flys.artifacts.states;

import java.util.List;

import org.apache.log4j.Logger;

import de.intevation.artifacts.Artifact;
import de.intevation.artifacts.CallContext;

import de.intevation.artifacts.common.model.KVP;

import de.intevation.flys.model.DischargeZone;
import de.intevation.flys.model.River;

import de.intevation.flys.artifacts.FLYSArtifact;
import de.intevation.flys.utils.FLYSUtils;


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 logger = Logger.getLogger(DischargeState.class);


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


    /**
     * 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 FLYSArtifact that provides river
     * information.
     * @param parameterName The name of a parameter.
     *
     * @return a KVP[].
     */
    @Override
    protected KVP<Integer, String>[] getOptions(
        Artifact artifact,
        String   parameterName
    )
    throws IllegalArgumentException
    {
        if (!testParameterName(parameterName)) {
            throw new IllegalArgumentException(
                "Invalid parameter for state: '" + parameterName + "'");
        }

        List<DischargeZone> zones = getDischargeZones(artifact);

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

        for (int i = 0, Z = zones.size(); i < Z; i++) {
            DischargeZone zone = zones.get(i);

            String lower = zone.getLowerDischarge();
            String upper = zone.getUpperDischarge();

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

        return kvp;
    }


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

        DischargeZone zone = DischargeZone.getDischargeZoneById(value);

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

        String lo = zone.getLowerDischarge();
        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(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 FLYSUtils.getRiver().
     *
     * @param artifact Needs to be a FLYSArtifact 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(Artifact artifact)
    throws IllegalArgumentException
    {
        River river = FLYSUtils.getRiver((FLYSArtifact) artifact);

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

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

        logger.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