view flys-artifacts/src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java @ 2745:b63017afbca8

Add helper to allow for points at duration curve facet. flys-artifacts/trunk@4480 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Wed, 23 May 2012 19:31:26 +0000
parents 0251393f037c
children 2f7fed1eb4bf
line wrap: on
line source
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.data.DefaultStateData;
import de.intevation.artifactdatabase.state.Facet;

import de.intevation.artifacts.Artifact;
import de.intevation.artifacts.ArtifactFactory;
import de.intevation.artifacts.ArtifactNamespaceContext;
import de.intevation.artifacts.CallMeta;

import de.intevation.artifacts.common.utils.XMLUtils;

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 :

http://dive4elements.wald.intevation.org