Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/DischargeState.java @ 3318:dbe2f85bf160
merged flys-artifacts/2.8
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:35 +0200 |
parents | 4a76da133144 |
children | e54f8dc222cf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/DischargeState.java Fri Sep 28 12:14:35 2012 +0200 @@ -0,0 +1,160 @@ +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); + + + @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 :