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