view artifacts/src/main/java/org/dive4elements/river/artifacts/BedHeightsArtifact.java @ 8964:45f1ad66560e

Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
author gernotbelger
date Thu, 29 Mar 2018 15:48:17 +0200
parents 8a1c6e2ad48b
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.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.dive4elements.artifactdatabase.state.DefaultOutput;
import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifactdatabase.state.FacetActivity;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.ArtifactFactory;
import org.dive4elements.artifacts.CallMeta;
import org.dive4elements.artifacts.common.utils.XMLUtils;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.model.minfo.BedHeightFacet;
import org.dive4elements.river.artifacts.model.minfo.BedHeightMinMaxFacet;
import org.dive4elements.river.artifacts.model.minfo.BedHeightSoundingWidthFacet;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.artifacts.states.StaticState;
import org.dive4elements.river.exports.process.BedHeightProcessor;
import org.dive4elements.river.model.BedHeightValueType;
import org.w3c.dom.Document;

public class BedHeightsArtifact extends AbstractStaticStateArtifact implements FacetTypes {
    /** The log for this class. */
    private static Logger log = Logger.getLogger(BedHeightsArtifact.class);

    /** Artifact name. */
    private static final String NAME = "bedheights";

    static {
        // TODO: Move to configuration.
        FacetActivity.Registry.getInstance().register(NAME, FacetActivity.INACTIVE);
    }

    public static final String STATIC_STATE_NAME = "state.additional_bedheights.static";

    /**
     * Data Item name to know whether we are Heighmarks and receive
     * some data slightly different.
     */
    public static final String DATA_HEIGHT_TYPE = "height_marks";

    /**
     * Trivial Constructor.
     */
    public BedHeightsArtifact() {
        log.debug("BedHeightsArtifact.BedHeightsArtifact");
    }

    @Override
    public String getName() {
        return NAME;
    }

    /**
     * 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("BedHeightsArtifact.setup");

        if (log.isDebugEnabled()) {
            log.debug(XMLUtils.toString(data));
        }

        final String code = getDatacageIDValue(data);

        createFacets(callMeta, code);

        super.setup(identifier, factory, context, callMeta, data, loadFacets);
    }

    private void createFacets(final CallMeta callMeta, final String code) {
        if (code == null)
            return;

        final String[] parts = code.split("-", 5);
        if (parts.length < 5) {
            log.error("Invalid datacage ID '" + code + "'");
            return;
        }

        // String name = parts[0];

        // type may only be 'single' or 'soundings'
        final String type = parts[1];

        final String heightId = parts[2];
        // final int hId = Integer.parseInt(heightId);

        // final String year = parts[3];
        final String bedHName = parts[4];

        addStringData("height_id", heightId);
        if (type.equals("soundings"))
            addStringData("type", "singlevalues");
        else
            addStringData("type", type);

        final ArrayList<Facet> facets = new ArrayList<>(1);

        if ("soundings".equals(type)) {
            final String description = Resources.getMsg(callMeta, "facet.bedheight.sounding_width", new Object[] { bedHName });
            facets.add(new BedHeightSoundingWidthFacet(BEDHEIGHT_SOUNDING_WIDTH, description));
        } else if ("single".equals(type))
            facets.add(new BedHeightFacet(BEDHEIGHT, bedHName));
        else if ("singleMin".equals(type))
            facets.add(new BedHeightMinMaxFacet(BedHeightProcessor.FACET_BED_HEIGHTS_MIN, bedHName, BedHeightValueType.min));
        else if ("singleMax".equals(type))
            facets.add(new BedHeightMinMaxFacet(BedHeightProcessor.FACET_BED_HEIGHTS_MAX, bedHName, BedHeightValueType.max));

        addFacets(STATIC_STATE_NAME, facets);
    }

    @Override
    protected void initStaticState() {

        log.debug("initStaticState " + getName() + " " + identifier());

        final StaticState state = new StaticState(STATIC_STATE_NAME);
        final DefaultOutput output = new DefaultOutput("general", "general", "image/png", "chart");

        final List<Facet> facets = getFacets(STATIC_STATE_NAME);
        output.addFacets(facets);
        state.addOutput(output);

        setStaticState(state);
    }

    @Override
    protected void initialize(final Artifact artifact, final Object context, final CallMeta meta) {
        // do not clone facets, etc. from master artifact

        log.debug("initialize");
        importData((D4EArtifact) artifact, "river");
        importData((D4EArtifact) artifact, "ld_from");
        importData((D4EArtifact) artifact, "ld_to");

        log.debug("ld_from " + getDataAsString("ld_from"));
        log.debug("ld_to " + getDataAsString("ld_to"));
    }
}

http://dive4elements.wald.intevation.org