view flys-artifacts/src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java @ 1092:0eb585cd3882

Added limited themeing-support for MainValues. flys-artifacts/trunk@2595 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Fri, 26 Aug 2011 12:44:12 +0000
parents e298c4d28927
children 139e7df1787c
line wrap: on
line source
package de.intevation.flys.artifacts;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import org.w3c.dom.Document;

import de.intevation.artifactdatabase.state.Facet;
import de.intevation.artifactdatabase.state.DefaultOutput;
import de.intevation.artifactdatabase.state.State;
import de.intevation.artifactdatabase.data.StateData;

import de.intevation.artifacts.Artifact;
import de.intevation.artifacts.ArtifactFactory;
import de.intevation.artifacts.CallMeta;
import de.intevation.flys.artifacts.model.RiverFactory;

import de.intevation.flys.artifacts.model.MainValuesQFacet;
import de.intevation.flys.artifacts.model.MainValuesWFacet;
import de.intevation.flys.artifacts.model.NamedDouble;
import de.intevation.artifactdatabase.data.DefaultStateData;
import de.intevation.flys.artifacts.states.StaticState;

import de.intevation.flys.model.Gauge;
import de.intevation.flys.model.MainValue;
import de.intevation.flys.model.River;


/**
 * Artifact to access names of Points Of Interest along a segment of a river.
 * This artifact neglects (Static)FLYSArtifacts capabilities of interaction
 * with the StateEngine by overriding the getState*-methods.
 */
public class MainValuesArtifact
extends      StaticFLYSArtifact
{
    /** The logger for this class. */
    private static Logger logger = Logger.getLogger(MainValuesArtifact.class);

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

    /** One and only state to be in. */
    protected transient State state = null;


    /**
     * Trivial Constructor.
     */
    public MainValuesArtifact() {
        logger.debug("MainValuesArtifact.MainValuesartifact()");
    }


    /**
     * Gets called from factory, to set things up.
     */
    @Override
    public void setup(
        String          identifier,
        ArtifactFactory factory,
        Object          context,
        CallMeta        callMeta,
        Document        data)
    {
        logger.debug("MainValuesArtifact.setup");
        super.setup(identifier, factory, context, callMeta, data);
        // TODO in initialize(*), access master/winfo artifact,
        // get locations and river.
    }


    @Override
    protected void initialize(Artifact artifact, Object context, CallMeta meta) {
        logger.debug("MainValuesArtifact.initialize");
        WINFOArtifact winfo = (WINFOArtifact) artifact;
        //River river = winfo.getRiver();
        double location = winfo.getLocations()[0];
        logger.debug("MainValues.location: " + location);
        addData("location", new DefaultStateData("location", null, null,
                    String.valueOf(location)));
        addData("river", winfo.getData("river"));
    }


    /**
     * Get a list containing the one and only State.
     * @param  context ignored.
     * @return list with one and only state.
     */
    @Override
    protected List<State> getStates(Object context) {
        ArrayList<State> states = new ArrayList<State>();
        states.add(getState(null,null));
        return states;
    }


    /**
     * Get the "current" state.
     * @param cc ignored.
     * @return the "current" state.
     */
    @Override
    protected State getCurrentState(Object cc) {
        return getState();
    }


    /**
     * Get the only possible state.
     * @return the state.
     */
    protected State getState() {
        return getState(null, null);
    }


    /**
     * Get the state.
     * @param context ignored.
     * @param stateID ignored.
     * @return the state.
     */
    @Override
    protected State getState(Object context, String stateID) {
        if (state != null) {
            
        }
        else {
            state = new StaticState();
            List<Facet> fs = new ArrayList<Facet>();
            Facet qfacet = new MainValuesQFacet();
            Facet wfacet = new MainValuesWFacet();
            fs.add(qfacet);
            fs.add(wfacet);
            // TODO check if facets and outputs already exist.
            // TODO also check, this is usually done in initialize, too.
            facets.put(state.getID(), fs);
            DefaultOutput mainValuesOutput1 = new DefaultOutput(
                        "discharge_curve", "output.discharge_curve", "image/png",
                        fs,
                        "chart");
            DefaultOutput mainValuesOutput2 = new DefaultOutput(
                        "computed_discharge_curve",
                        "output.computed_discharge_curve", "image/png",
                        fs,
                        "chart");
    
            state.getOutputs().add(mainValuesOutput1);
            state.getOutputs().add(mainValuesOutput2);
        }
        return state;
    }

    /**
     * Get the river.
     * @todo resolve, this is a duplicate of WINFOArtifact.
     */
    public River getRiver() {
        StateData dRiver = getData("river");

        return dRiver != null
            ? RiverFactory.getRiver((String) dRiver.getValue())
            : null;
    }

    /**
     * Access the Gauge that the mainvalues are taken from.
     * @return Gauge that main values are taken from or null in case of
     *         invalid parameterization.
     */
    protected Gauge getGauge() {
        River river = getRiver();

        if (river == null) {
            return null;
        }

        double location = Double.parseDouble(
                (String)getData("location").getValue());

        return river.determineGaugeByPosition(location);
    }


    /**
     * Get datum of Gauge.
     * @return datum of gauge.
     */
    public double getGaugeDatum() {
        Gauge gauge = getGauge();
        if (gauge == null) { return 0.0f; }
        return gauge.getDatum().doubleValue();
    }


    /**
     * Get a list of "Q" main values.
     * @return list of Q main values.
     */
    public List<NamedDouble> getMainValuesQ() {
        List<NamedDouble> filteredList = new ArrayList<NamedDouble>();
        Gauge gauge = getGauge();
        if (gauge != null) {
            List<MainValue> orig = gauge.getMainValues();
            for (MainValue mv : orig) {
                if (mv.getMainValue().getType().getName().equals("Q")) {
                    filteredList.add(new NamedDouble(
                                mv.getMainValue().getName(),
                                mv.getValue().doubleValue()
                                ));
                }
            }
        }
        return filteredList;
    }


    /**
     * Get a list of "W" main values.
     * @return list of W main values.
     */
    public List<NamedDouble> getMainValuesW() {
        List<NamedDouble> filteredList = new ArrayList<NamedDouble>();
        Gauge gauge = getGauge();
        double datum = gauge.getDatum().doubleValue();
        logger.debug("DATUM:: " + datum);
        if (gauge != null) {
            List<MainValue> orig = gauge.getMainValues();
            for (MainValue mv : orig) {
                if (mv.getMainValue().getType().getName().equals("W")) {
                    filteredList.add(new NamedDouble(
                                mv.getMainValue().getName(),
                                mv.getValue().doubleValue()/100.f + datum
                                ));
                }
            }
        }
        return filteredList;
    }
}

http://dive4elements.wald.intevation.org