view artifacts/src/main/java/org/dive4elements/river/artifacts/BedHeightsArtifact.java @ 9425:3f49835a00c3

Extended CrossSectionFacet so it may fetch different data from within the artifact result. Also allows to have acces to the potentially already computed artifact result via its normal computation cache.
author gernotbelger
date Fri, 17 Aug 2018 15:31:02 +0200
parents 45f1ad66560e
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