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 :