Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/GaugeDischargeArtifact.java @ 6140:60b94dec104b
Add handling of bound artifacts.
When an artifact is bound to an out its facets will only be shown
in that Out. They will be removed in the blackboard pass and marked
as incompatible by the AttributeWriter
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Fri, 31 May 2013 15:29:30 +0200 |
parents | af13ceeba52a |
children | 20a32dbdbb59 |
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; 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 org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifacts.Artifact; import org.dive4elements.artifacts.ArtifactFactory; import org.dive4elements.artifacts.CallMeta; import org.dive4elements.river.artifacts.model.FacetTypes; import org.dive4elements.river.artifacts.model.WQKms; import org.dive4elements.river.artifacts.states.DefaultState; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DischargeTables; import org.dive4elements.river.model.Gauge; import org.dive4elements.river.model.River; import org.dive4elements.river.utils.RiverUtils; /** * Artifact to get discharge curves at gauges. */ 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.GaugeDischargeArtifact()"); } /** * 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"); String ids = StaticD4EArtifact.getDatacageIDValue(data); addStringData("ids", ids); logger.debug("id for gaugedischarge: " + ids); super.setup(identifier, factory, context, callMeta, data); } /** Return the name of this artifact. */ public String getName() { return ARTIFACT_NAME; } /** * 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>(); D4EArtifact artifact = (D4EArtifact) art; importData(artifact, "river"); // Get the location(s) //importData(artifact, "ld_mode", ld_from, ld_to, 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() + "/ " + getCurrentStateId() + ")."); addFacets(getCurrentStateId(), fs); } else { logger.debug("No facets to add in GaugeDischargeArtifact.initialize (" + state.getID() + "/ "+getCurrentStateId()+")."); } } /** Get the Gauges name which came with datacage data-document. */ public String getGaugeName() { return this.getDataAsString("ids"); } /** Get the Gauges which came with datacage data-document. */ public Gauge getGauge() { River river = RiverUtils.getRiver(this); return river.determineGaugeByName(getGaugeName()); } /** * Returns the data that is used to create discharge curves. * @return CalculationResult with WQKms. */ public CalculationResult getDischargeCurveData() { River river = RiverUtils.getRiver(this); if (river == null) { return error(new WQKms[0], "no.river.selected"); } /* // This one would allow to automatically pick the right Gauge. double [] distance = RiverUtils.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: got " + gauges.size() + " 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(), getDataAsString("ids")); Map<String, double [][]> map = dt.getValues(100); ArrayList<WQKms> res = new ArrayList<WQKms>(); Gauge gauge = river.determineGaugeByName(this.getDataAsString("ids")); String name = getGaugeName(); double [][] values = map.get(name); if (values == null) { logger.error("No values for this gauge / discharge found."); return error(new WQKms[0], "no.gauge.found"); } for (int i = 0 ; i < values[0].length; i++) { values[0][i] += gauge.getDatum().doubleValue(); } double [] kms = new double[values[0].length]; Arrays.fill(kms, gauge.getStation().doubleValue()); res.add(new WQKms(kms, values[0], values[1], name)); return new CalculationResult( res.toArray(new WQKms[res.size()]), new Calculation()); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :