view flys-artifacts/src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java @ 4129:989f6f0d1986

NPE fix when comparing Double with double
author Christian Lins <christian.lins@intevation.de>
date Sun, 14 Oct 2012 11:21:27 +0200
parents 066e2b4d69ca
children 6153c50f78cf
line wrap: on
line source
package de.intevation.flys.artifacts;

import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.json.JSONArray;
import org.json.JSONException;
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.geom.Lines;
import de.intevation.flys.artifacts.model.FacetTypes;
import de.intevation.flys.artifacts.states.DefaultState;
import de.intevation.flys.model.FastCrossSectionLine;


/**
 * Artifact to store user-added points and water lines.
 */
public class ManualPointsArtifact
extends      StaticFLYSArtifact
implements   FacetTypes, WaterLineArtifact
{
    private static final long serialVersionUID = 7096025125474986011L;

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


    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. */
    @Override
    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(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