view artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFacet.java @ 8142:d4e4dde1d5cb

With the exception of real calculation results, descriptions of sediment loads can all follow the same pattern.
author Tom Gottfried <tom@intevation.de>
date Tue, 26 Aug 2014 17:16:21 +0200
parents 8eb25cbfe242
children eb48b244921d
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.model.minfo;

import gnu.trove.TDoubleArrayList;

import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifactdatabase.state.StaticFacet;

import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.artifacts.CallMeta;

import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.access.RiverAccess;
import org.dive4elements.river.artifacts.resources.Resources;

import org.dive4elements.river.artifacts.model.DataFacet;
import org.dive4elements.river.artifacts.model.FacetTypes;

import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;

import org.apache.log4j.Logger;

import org.w3c.dom.Document;


/** Facet to access various sediment loads. */
public class SedimentLoadFacet
extends DataFacet
implements   FacetTypes, StaticFacet
{
    private static Logger logger = Logger.getLogger(SedimentLoadFacet.class);

    private static final String NAME = "sedimentload";

    public SedimentLoadFacet() {
    }

    public SedimentLoadFacet(int idx, String name, String description,
        ComputeType type, String stateId, String hash) {
        super(idx, name, description, type, hash, stateId);
        this.metaData.put("X", "chart.longitudinal.section.xaxis.label");
        this.metaData.put("Y", "");
    }

    @Override
    public Object getData(Artifact artifact, CallContext context) {
        logger.debug("get Data");
        D4EArtifact arti = (D4EArtifact) artifact;

        RiverAccess access = new RiverAccess(arti);
        String idStr = arti.getDataAsString("load_id");
        int id = Integer.valueOf(idStr);

        /* Get all the data from the river. This will be nicely cached. */
        SedimentLoadData allLoadData = SedimentLoadDataFactory.INSTANCE.getSedimentLoadData(
                access.getRiverName());

        /* Now lets get what we want */
        TDoubleArrayList xPos = new TDoubleArrayList();
        TDoubleArrayList yPos = new TDoubleArrayList();

        for (SedimentLoadData.Station sta: allLoadData.getStations()) {
            double value = sta.findValueByLoadId(id);
            if (Double.isNaN(value)) {
                continue;
            }
            xPos.add(sta.getStation());
            yPos.add(value);
        }

        return new double[][] {xPos.toNativeArray(), yPos.toNativeArray()};
    }

    @Override
    public void setup(Artifact artifact, Document data, CallMeta callMeta) {
        logger.debug("setup");
        String code = D4EArtifact.getDatacageIDValue(data);
        String[] split = code.split(";");
        String idStr = split[0];

        String fraction = split.length >= 2 ? split[1] : "";
        String years    = split.length >= 3 ? split[2] : "";

        // Name has the pattern sedimentload.<grainfraction_name>
        name = NAME + "." + fraction;
        logger.debug("Created facet: " + name);

        description = Resources.getMsg(
                callMeta,
                "facet.sedimentload." + fraction,
                new Object[] { years, "t/a" });

        ((D4EArtifact)artifact).addStringData("load_id", idStr);
    }


    /** Copy deeply. */
    @Override
    public Facet deepCopy() {
        SedimentLoadFacet copy = new SedimentLoadFacet();
        copy.set(this);
        copy.type = type;
        copy.hash = hash;
        copy.stateId = stateId;
        return copy;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org