Mercurial > dive4elements > river
changeset 2696:1bc35de0b786
Improved the states for MINFO flow velocity calculation.
flys-artifacts/trunk@4406 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 15 May 2012 07:15:36 +0000 |
parents | ae0742f92cd5 |
children | 8a6ce15ced7f |
files | flys-artifacts/ChangeLog flys-artifacts/doc/conf/artifacts/minfo.xml flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/DischargeState.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/MultiIntArrayState.java |
diffstat | 4 files changed, 225 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/flys-artifacts/ChangeLog Mon May 14 16:57:58 2012 +0000 +++ b/flys-artifacts/ChangeLog Tue May 15 07:15:36 2012 +0000 @@ -1,3 +1,16 @@ +2012-05-15 Ingo Weinzierl <ingo@intevation.de> + + * doc/conf/artifacts/minfo.xml: Added new transistions and states for + MINFO flow velocity calculation. + + * src/main/java/de/intevation/flys/artifacts/states/MultiIntArrayState.java: + New abstract states that might be used to append a list of available + integer values to the DESCRIBE document. + + * src/main/java/de/intevation/flys/artifacts/states/DischargeState.java: + Concrete subclass of MultiIntArrayState which implements the abstract + method getOptions(). + 2012-05-14 Sascha L. Teichmann <sascha.teichmann@intevation.de> * src/main/java/de/intevation/flys/artifacts/model/Parameters.java:
--- a/flys-artifacts/doc/conf/artifacts/minfo.xml Mon May 14 16:57:58 2012 +0000 +++ b/flys-artifacts/doc/conf/artifacts/minfo.xml Tue May 15 07:15:36 2012 +0000 @@ -14,6 +14,28 @@ <state id="state.minfo.calculation_mode" description="state.minfo.calculation_mode" state="de.intevation.flys.artifacts.states.CalculationSelectMinfo" helpText="help.minfo"> <data name="calculation_mode" type="String"/> </state> + + <transition transition="de.intevation.flys.artifacts.transitions.ValueCompareTransition"> + <from state="state.minfo.calculation_mode"/> + <to state="state.minfo.distance_only"/> + <condition data="calculation_mode" value="calc.flow.velocity" operator="equal"/> + </transition> + + <state id="state.minfo.distance_only" description="state.minfo.distance_only" state="de.intevation.flys.artifacts.states.DistanceOnlySelect" helpText="help.minfo.distance"> + <data name="ld_from" type="Double" /> + <data name="ld_to" type="Double" /> + </state> + + <transition transition="de.intevation.flys.artifacts.transitions.DefaultTransition"> + <from state="state.minfo.distance_only"/> + <to state="state.minfo.dischargestate"/> + </transition> + + <state id="state.minfo.dischargestate" description="state.minfo.dischargestate" state="de.intevation.flys.artifacts.states.DischargeState" helpText="help.minfo.dischargestate"> + <data name="total.channel" type="intoptions"/> + <data name="main.channel" type="intoptions"/> + </state> + </states> </artifact>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/DischargeState.java Tue May 15 07:15:36 2012 +0000 @@ -0,0 +1,131 @@ +package de.intevation.flys.artifacts.states; + +import java.util.List; + +import org.apache.log4j.Logger; + +import de.intevation.artifacts.Artifact; + +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; i < zones.size(); 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; + } + + + /** + * 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 :
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/MultiIntArrayState.java Tue May 15 07:15:36 2012 +0000 @@ -0,0 +1,59 @@ +package de.intevation.flys.artifacts.states; + +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.CallContext; + +import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator; +import de.intevation.artifacts.common.model.KVP; + + +/** + * State that holds minimun and maximum (for validation). + * + * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> + */ +public abstract class MultiIntArrayState extends DefaultState { + + private static final Logger logger = + Logger.getLogger(MultiIntArrayState.class); + + + @Override + protected void appendItems( + Artifact artifact, + ElementCreator creator, + String name, + CallContext context, + Element select + ) { + try { + creator.addAttr(select, "type", "intoptions", true); + + Element choices = creator.create("choices"); + + for (KVP kvp: getOptions(artifact, name)) { + Element item = creator.create("item"); + creator.addAttr(item, "label", kvp.getValue().toString(), true); + item.setTextContent(kvp.getKey().toString()); + + choices.appendChild(item); + } + + select.appendChild(choices); + } + catch (IllegalArgumentException iae) { + logger.warn("Illegal argument", iae); + } + } + + + protected abstract KVP<Integer, String>[] getOptions( + Artifact artifact, + String parameterName + ) + throws IllegalArgumentException; +}