Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/states/DischargeState.java @ 8587:07c9ac22f611
(issue1755) Generalise BedQuality result handling
The bedquality calculation now produces a result for each time period
which has BedQualityResultValues for each specific result type.
Formally this was split up in density, porosity and diameter classes
with some bedload diameter classes mixed in for extra fun.
The intent of this commit is to allow more shared code and generic
access patterns to the BedQuality results.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Wed, 18 Mar 2015 18:42:08 +0100 |
parents | e4606eae8ea5 |
children | f575ff573cbb 0a5239a1e46e |
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.List; import java.util.Collections; import java.util.Comparator; 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.model.DischargeZone; import org.dive4elements.river.model.River; import org.dive4elements.river.artifacts.D4EArtifact; 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"; } /** * 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( 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()]; Collections.sort(zones, new Comparator<DischargeZone>() { @Override public int compare(DischargeZone a, DischargeZone b) { return a.getValue().compareTo(b.getValue()); } }); int i = 0; for (DischargeZone zone: zones) { 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); } i++; } 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 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(Artifact artifact) throws IllegalArgumentException { River river = RiverUtils.getRiver((D4EArtifact) artifact); if (river == null) { throw new IllegalArgumentException("No river found"); } 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 :