view artifacts/src/main/java/org/dive4elements/river/artifacts/ManualPointsArtifact.java @ 9479:2b83d3a96703

i18n TODO "benutzerdefiniert" = "custom" fixed
author gernotbelger
date Mon, 10 Sep 2018 15:31:55 +0200
parents 3f49835a00c3
children
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.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.ArtifactFactory;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.artifacts.CallMeta;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.states.DefaultState;
import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
import org.json.JSONArray;
import org.json.JSONException;
import org.w3c.dom.Document;

/**
 * Artifact to store user-added points and water lines.
 */
public class ManualPointsArtifact extends StaticD4EArtifact implements FacetTypes, WaterLineArtifact {

    private static final long serialVersionUID = 7096025125474986011L;

    /** The log for this class. */
    private static Logger log = Logger.getLogger(ManualPointsArtifact.class);

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

    public ManualPointsArtifact() {
        log.debug("ManualPointsArtifact.ManualPointsArtifact()");
    }

    /**
     * Gets called from factory to set things up.
     */
    @Override
    public void setup(final String identifier, final ArtifactFactory factory, final Object context, final CallMeta callMeta, final Document data,
            final List<Class> loadFacets) {
        log.debug("ManualPointsArtifact.setup");
        super.setup(identifier, factory, context, callMeta, data, loadFacets);
        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(final 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).
     */
    private String getLinesData(final 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(final Artifact artifact, final Object context, final CallMeta meta) {
        log.debug("ManualPointsArtifact.initialize");
        final List<Facet> fs = new ArrayList<>();

        final DefaultState state = (DefaultState) getCurrentState(context);
        state.computeInit(this, hash(), context, meta, fs);
        if (!fs.isEmpty()) {
            log.debug("Facets to add in ManualPointsArtifact.initialize .");
            addFacets(getCurrentStateId(), fs);
        } else {
            log.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.
     */
    private double getLine(final int index) {
        try {
            final JSONArray lines = new JSONArray(getLinesData(null));
            final JSONArray array = lines.getJSONArray(index);

            return array.getDouble(0);
        }
        catch (final JSONException e) {
            log.error("Could not decode json for line.", e);
            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).
     * @param context
     *            (ignored in this implementation).
     */
    @Override
    public double getWaterLevel(final ComputeType type, final String hash, final String stateId, final double currentKm, final Serializable waterLineIndex,
            final double nextKm, final double prevKm, final CallContext context) {
        final int index = (int) waterLineIndex;
        return getLine(index);
    }
}

http://dive4elements.wald.intevation.org