Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java @ 2793:6310b1582f2d
merged flys-artifacts/2.7
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:30 +0200 |
parents | 2f7fed1eb4bf |
children | 6e4ad35bcb11 |
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/GaugeDischargeArtifact.java Fri Sep 28 12:14:30 2012 +0200 @@ -0,0 +1,199 @@ +package de.intevation.flys.artifacts; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; + +import de.intevation.artifactdatabase.state.Facet; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallMeta; + + +import de.intevation.flys.artifacts.StaticFLYSArtifact; +import de.intevation.flys.artifacts.model.FacetTypes; +import de.intevation.flys.artifacts.model.WQKms; + +import de.intevation.flys.artifacts.states.DefaultState; + +import de.intevation.flys.artifacts.model.Calculation; +import de.intevation.flys.artifacts.model.CalculationResult; + +import de.intevation.flys.artifacts.model.DischargeTables; + +import de.intevation.flys.model.Gauge; +import de.intevation.flys.model.River; + +import de.intevation.flys.utils.FLYSUtils; + + +/** + * Artifact to store user-added points. + */ +public class GaugeDischargeArtifact +extends WINFOArtifact +implements FacetTypes +{ + /** The logger for this class. */ + private static Logger logger = Logger.getLogger(GaugeDischargeArtifact.class); + + /** The name of the artifact. */ + public static final String ARTIFACT_NAME = "gaugedischarge"; + + + /** + * Trivial Constructor. + */ + public GaugeDischargeArtifact() { + logger.debug("GaugeDischargeArtifact.HistoricalQArtifact()"); + } + + + /** + * Gets called from factory, to set things up. + * Especially, when loaded via datacage mechanisms, provide the + * data document. + * @param data filled with stuff from dc, if any. + */ + @Override + public void setup( + String identifier, + ArtifactFactory factory, + Object context, + CallMeta callMeta, + Document data) + { + logger.debug("GaugeDischargeArtifact.setup"); + super.setup(identifier, factory, context, callMeta, data); + String ids = StaticFLYSArtifact.getDatacageIDValue(data); + logger.debug("id for gaugedischarge: " + ids); + } + + + /** Return the name of this artifact. */ + public String getName() { + return ARTIFACT_NAME; + } + + + /** Access state data storing the jsonstring with points. + public String getPointsData(String facetName) { + return getDataAsString(facetName + ".data"); + }*/ + + + /** + * Setup state and facet, copy from master artifact. + */ + @Override + protected void initialize(Artifact art, Object context, CallMeta meta) { + logger.debug("GaugeDischargeArtifact.initialize"); + List<Facet> fs = new ArrayList<Facet>(); + FLYSArtifact artifact = (FLYSArtifact) art; + + // Get the location(s) + //importData(artifact, "ld_mode"); + //importData(artifact, "ld_from"); + //importData(artifact, "ld_to"); + //importData(artifact, "ld_locations"); + addStringData("ld_from", "0"); + addStringData("ld_to", "1000"); + addStringData("ld_mode", "distance"); + + + DefaultState state = (DefaultState) getCurrentState(context); + state.computeInit(this, hash(), context, meta, fs); + if (!fs.isEmpty()) { + logger.debug("Facets to add in GaugeDischargeArtifact.initialize. (" + + state.getID() + ")."); + facets.put(getCurrentStateId(), fs); + } + else { + logger.debug("No facets to add in GaugeDischargeArtifact.initialize (" + + state.getID() + ")."); + } + } + + + /** + * Determines Facets initial disposition regarding activity (think of + * selection in Client ThemeList GUI). This will be checked one time + * when the facet enters a collections describe document. + * + * @param facetName name of the facet. + * @param index index of the facet. + * @return 0 if not active + */ + @Override + public int getInitialFacetActivity( + String outputName, + String facetName, + int index) + { + return 1; + } + + + /** + * Returns the data that is used to create discharge curves. + * + */ + public CalculationResult getDischargeCurveData() { + + River river = FLYSUtils.getRiver(this); + if (river == null) { + return error(new WQKms[0], "no.river.selected"); + } + + double [] distance = FLYSUtils.getKmRange(this); + logger.debug("getDischargeCurveData: get range"); + + if (distance == null) { + return error(new WQKms[0], "no.range.found"); + } + + List<Gauge> gauges = river.determineGauges(distance[0], distance[1]); + logger.debug("getDischargeCurveData: get gauges"); + + if (gauges.isEmpty()) { + return error(new WQKms[0], "no.gauge.selected"); + } + + String [] names = new String[gauges.size()]; + + for (int i = 0; i < names.length; ++i) { + names[i] = gauges.get(i).getName(); + logger.debug("getDischargeCurveData: name " + names[i]); + } + + DischargeTables dt = new DischargeTables(river.getName(), names); + + Map<String, double [][]> map = dt.getValues(100d); + + ArrayList<WQKms> res = new ArrayList<WQKms>(); + + for (Gauge gauge: gauges) { + String name = gauge.getName(); + double [][] values = map.get(name); + if (values == null) { + continue; + } + double [] kms = new double[values[0].length]; + Arrays.fill(kms, gauge.getStation().doubleValue()); + res.add(new WQKms(kms, values[0], values[1], name)); + logger.debug("getDischargeCurveData: add one res gauge"); + } + + return new CalculationResult( + res.toArray(new WQKms[res.size()]), + new Calculation()); + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :