teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
teichmann@5863: * Software engineering by Intevation GmbH
teichmann@5863: *
teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3)
teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the
teichmann@5994: * documentation coming with Dive4Elements River for details.
teichmann@5863: */
teichmann@5863:
teichmann@5831: package org.dive4elements.river.artifacts.states;
ingo@2696:
aheinecke@6185: import java.util.Collections;
aheinecke@6185: import java.util.Comparator;
gernotbelger@9390: import java.util.List;
ingo@2696:
ingo@2696: import org.apache.log4j.Logger;
teichmann@5831: import org.dive4elements.artifacts.Artifact;
teichmann@5831: import org.dive4elements.artifacts.CallContext;
teichmann@5831: import org.dive4elements.artifacts.common.model.KVP;
gernotbelger@9390: import org.dive4elements.river.artifacts.D4EArtifact;
teichmann@5831: import org.dive4elements.river.model.DischargeZone;
teichmann@5831: import org.dive4elements.river.model.River;
teichmann@5865: import org.dive4elements.river.utils.RiverUtils;
ingo@2696:
ingo@2696: public class DischargeState extends MultiIntArrayState {
ingo@2696:
gernotbelger@9390: public static final String MAIN_CHANNEL = "main_channel";
ingo@3759: public static final String TOTAL_CHANNEL = "total_channel";
ingo@2696:
teichmann@8202: private static final Logger log = Logger.getLogger(DischargeState.class);
ingo@2696:
felix@3927: /** Let client display a matrix. */
ingo@2696: @Override
ingo@2696: public String getUIProvider() {
gernotbelger@9390: return "parameter-matrix-flowvelocity";
ingo@2696: }
ingo@2696:
ingo@2696: /**
ingo@2696: * This method fetches all DischargeZones for a given river (extracted from
ingo@2696: * artifact) and returns a KVP[] where the key is the ID of the
ingo@2696: * DischargeZone and the value is a string that consists of lower discharge
ingo@2696: * and upper discharge.
ingo@2696: *
gernotbelger@9390: * @param artifact
gernotbelger@9390: * Needs to be a D4EArtifact that provides river
gernotbelger@9390: * information.
gernotbelger@9390: * @param parameterName
gernotbelger@9390: * The name of a parameter.
ingo@2696: *
ingo@2696: * @return a KVP[].
ingo@2696: */
ingo@2696: @Override
gernotbelger@9390: protected KVP[] getOptions(final Artifact artifact, final String parameterName) throws IllegalArgumentException {
ingo@2696: if (!testParameterName(parameterName)) {
gernotbelger@9390: throw new IllegalArgumentException("Invalid parameter for state: '" + parameterName + "'");
ingo@2696: }
ingo@2696:
gernotbelger@9390: final List zones = getDischargeZones(artifact);
ingo@2696:
gernotbelger@9390: final KVP[] kvp = new KVP[zones.size()];
ingo@2696:
aheinecke@6185: Collections.sort(zones, new Comparator() {
aheinecke@6186: @Override
gernotbelger@9390: public int compare(final DischargeZone a, final DischargeZone b) {
aheinecke@6185: return a.getValue().compareTo(b.getValue());
aheinecke@6185: }
aheinecke@6185: });
ingo@2696:
aheinecke@6185: int i = 0;
aheinecke@6185:
gernotbelger@9390: for (final DischargeZone zone : zones) {
gernotbelger@9390: final String lower = zone.getLowerDischarge();
gernotbelger@9390: final String upper = zone.getUpperDischarge();
ingo@2696:
ingo@2696: if (lower.equals(upper)) {
ingo@2696: kvp[i] = new KVP(zone.getId(), lower);
gernotbelger@9390: } else {
ingo@2696: kvp[i] = new KVP(zone.getId(), lower + " - " + upper);
ingo@2696: }
aheinecke@6185: i++;
ingo@2696: }
ingo@2696:
ingo@2696: return kvp;
ingo@2696: }
ingo@2696:
ingo@2705: @Override
gernotbelger@9390: protected String getLabelFor(final CallContext cc, final String parameterName, final int value) throws IllegalArgumentException {
ingo@2705: if (!testParameterName(parameterName)) {
gernotbelger@9390: throw new IllegalArgumentException("Invalid parameter for state: '" + parameterName + "'");
ingo@2705: }
ingo@2705:
gernotbelger@9390: final DischargeZone zone = DischargeZone.getDischargeZoneById(value);
ingo@2705:
ingo@2705: if (zone == null) {
gernotbelger@9390: throw new IllegalArgumentException("Invalid id for DischargeZone: '" + value + "'");
ingo@2705: }
ingo@2705:
gernotbelger@9390: final String lo = zone.getLowerDischarge();
gernotbelger@9390: final String hi = zone.getUpperDischarge();
ingo@2705:
gernotbelger@9390: return hi != null && !lo.equals(hi) ? lo + " - " + hi : lo;
ingo@2705: }
ingo@2705:
ingo@2696: /**
ingo@2696: * This method might be used to test, if a parameter name is handled by this
ingo@2696: * state.
ingo@2696: *
gernotbelger@9390: * @param parameterName
gernotbelger@9390: * The name of a parameter.
ingo@2696: *
ingo@2696: * @return true, if parameterName is one of MAIN_CHANNEL or
gernotbelger@9390: * TOTAL_CHANNEL. Otherwise false.
ingo@2696: */
gernotbelger@9390: protected boolean testParameterName(final String parameterName) {
ingo@2696: if (parameterName == null || parameterName.length() == 0) {
ingo@2696: return false;
gernotbelger@9390: } else if (parameterName.equals(MAIN_CHANNEL)) {
ingo@2696: return true;
gernotbelger@9390: } else if (parameterName.equals(TOTAL_CHANNEL)) {
ingo@2696: return true;
gernotbelger@9390: } else {
ingo@2696: return false;
ingo@2696: }
ingo@2696: }
ingo@2696:
ingo@2696: /**
ingo@2696: * Returns all discharge zones for a given river. The river information is
teichmann@5865: * extracted from artifact using RiverUtils.getRiver().
ingo@2696: *
gernotbelger@9390: * @param artifact
gernotbelger@9390: * Needs to be a D4EArtifact that stores a rivername.
ingo@2696: *
ingo@2696: * @return a list of DischargeZones.
ingo@2696: *
gernotbelger@9390: * @throws IllegalArgumentException
gernotbelger@9390: * if no river information is provided by
gernotbelger@9390: * artifact.
ingo@2696: */
gernotbelger@9390: protected List getDischargeZones(final Artifact artifact) throws IllegalArgumentException {
gernotbelger@9390: final River river = RiverUtils.getRiver((D4EArtifact) artifact);
ingo@2696:
ingo@2696: if (river == null) {
ingo@2696: throw new IllegalArgumentException("No river found");
ingo@2696: }
ingo@2696:
gernotbelger@9390: final List zones = DischargeZone.getDischargeZones(river);
ingo@2696:
teichmann@8202: log.debug("Found " + zones.size() + " DischargeZones.");
ingo@2696:
ingo@2696: return zones;
ingo@2696: }
ingo@2696: }
ingo@2696: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :