view flys-artifacts/src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java @ 3743:51f76225823b

Extreme waterlevels: calculate the segments for Q km ranges. flys-artifacts/trunk@5426 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 10 Sep 2012 15:59:34 +0000
parents afc7bfb4800b
children 066e2b4d69ca
line wrap: on
line source
package de.intevation.flys.artifacts;

import java.util.ArrayList;
import java.util.List;

import java.awt.geom.Point2D;

import org.apache.log4j.Logger;

import org.w3c.dom.Document;

import org.json.JSONArray;
import org.json.JSONException;

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.model.FacetTypes;

import de.intevation.flys.artifacts.states.DefaultState;

import de.intevation.flys.model.FastCrossSectionLine;

import de.intevation.flys.artifacts.geom.Lines;


/**
 * Artifact to store user-added points and water lines.
 */
public class ManualPointsArtifact
extends      StaticFLYSArtifact
implements   FacetTypes, WaterLineArtifact
{
    /** The logger for this class. */
    private static Logger logger = Logger.getLogger(ManualPointsArtifact.class);

    /** The name of the artifact. */
    public static final String ARTIFACT_NAME = "manualpoints";


    /**
     * Trivial Constructor.
     */
    public ManualPointsArtifact() {
        logger.debug("ManualPointsArtifact.ManualPointsArtifact()");
    }


    /**
     * Gets called from factory, to set things up.
     */
    @Override
    public void setup(
        String          identifier,
        ArtifactFactory factory,
        Object          context,
        CallMeta        callMeta,
        Document        data)
    {
        logger.debug("ManualPointsArtifact.setup");
        super.setup(identifier, factory, context, callMeta, data);
        initialize(null, context, callMeta);
    }


    /** 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");
    }


    /**
     * Access state data storing the jsonstring with lines.
     * @param facetName Name of facet or null if the so far
     *                  only known case should be picked.
     * @return (String) value of data element (expect json).
     */
    public String getLinesData(String facetName) {
        if (facetName == null)
            return getDataAsString("cross_section.manualpoints.lines");
        // TODO .lineS?
        return getDataAsString(facetName + ".line");
    }


    /** Setup state and facet. */
    @Override
    protected void initialize(Artifact artifact, Object context, CallMeta meta) {
        logger.debug("ManualPointsArtifact.initialize");
        List<Facet> fs = new ArrayList<Facet>();

        DefaultState state = (DefaultState) getCurrentState(context);
        state.computeInit(this, hash(), context, meta, fs);
        if (!fs.isEmpty()) {
            logger.debug("Facets to add in ManualPointsArtifact.initialize .");
            facets.put(getCurrentStateId(), fs);
        }
        else {
            logger.debug("No facets to add in ManualPointsArtifact.initialize ("
                + state.getID() + ").");
        }
    }


    /**
     * Get value of line at index.
     * @param index index in json array defining lines.
     * @return water height of line at given index.
     */
    protected double getLine(int index) {
        try {
            JSONArray lines = new JSONArray((String) getLinesData(null));
            JSONArray array = lines.getJSONArray(index);

            return array.getDouble(0);
        }
        catch(JSONException e){
            logger.error("Could not decode json for line.");
            return 0d;
        }
    }


    /**
     * Get the water line "surface".
     * @param index index of facets data.
     * @param csl 'ground' against which to determine water surface.
     * @param a (ignored in this implementation).
     * @param b (ignored in this implementation).
     */
    @Override
    public Lines.LineData getWaterLines(
        int                  index,
        FastCrossSectionLine csl,
        double a, double b
    ) {
        List<Point2D> points = csl.getPoints();
        return Lines.createWaterLines(points, getLine(index));
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org