view flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java @ 1686:e8d1e531687a

Bugfix: #114 Enabled rendering charts with a single data point. flys-artifacts/trunk@2904 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 07 Oct 2011 13:15:48 +0000
parents 0ebce697adcc
children 8d08f6641372
line wrap: on
line source
package de.intevation.flys.artifacts.states;

import java.text.NumberFormat;
import java.util.List;

import org.apache.log4j.Logger;

import de.intevation.artifacts.CallContext;

import de.intevation.artifactdatabase.state.Facet;

import de.intevation.flys.artifacts.FLYSArtifact;
import de.intevation.flys.artifacts.WINFOArtifact;
import de.intevation.flys.artifacts.model.DataFacet;
import de.intevation.flys.artifacts.model.CrossSectionFacet;
import de.intevation.flys.artifacts.model.CrossSectionWaterLineFacet;
import de.intevation.flys.artifacts.model.CalculationResult;
import de.intevation.flys.artifacts.model.FacetTypes;
import de.intevation.flys.artifacts.model.ReportFacet;
import de.intevation.flys.artifacts.model.WaterlevelFacet;
import de.intevation.flys.artifacts.model.WQKms;
import de.intevation.flys.utils.Formatter;


public class WaterlevelState
extends      DefaultState
implements   FacetTypes
{
    /** The logger that is used in this state. */
    private static Logger logger = Logger.getLogger(WaterlevelState.class);


    @Override
    protected String getUIProvider() {
        return "continue";
    }


    protected Object compute(
        WINFOArtifact winfo,
        CallContext   cc,
        String        hash,
        List<Facet>   facets,
        Object        old
    ) {
        String id = getID();

        CalculationResult res = old instanceof CalculationResult
            ? (CalculationResult)old
            : winfo.getWaterlevelData();

        if (facets == null) {
            return res;
        }

        WQKms [] wqkms = (WQKms [])res.getData();

        for (int i = 0; i < wqkms.length; i++) {
            String  name = wqkms[i].getName();
            boolean isQ  = winfo.isQ();

            String nameW = createWTitle(cc, name, isQ);
            String nameQ = createQTitle(cc, name, isQ);

            logger.debug("Create facet: " + nameW);
            logger.debug("Create facet: " + nameQ);

            Facet w = new WaterlevelFacet(
                i, LONGITUDINAL_W, nameW, ComputeType.ADVANCE, id, hash);
            Facet q = new WaterlevelFacet(
                i, LONGITUDINAL_Q, nameQ, ComputeType.ADVANCE, id, hash);

            facets.add(w);
            facets.add(q);
        }

        if (wqkms.length > 0) {
            Facet wst = new DataFacet(
                WST, "WST data", ComputeType.ADVANCE, hash, id);
            Facet csv = new DataFacet(
                CSV, "CSV data", ComputeType.ADVANCE, hash, id);

            facets.add(wst);
            facets.add(csv);
            // Also register the CrossSectionFacet (added to respective out).
            facets.add(new CrossSectionFacet(winfo.getCrossSectionName()));
            // Assume to be in wq_single mode.
            // TODO: Use createWTitle for label.
            facets.add(new CrossSectionWaterLineFacet("Q=" +
                winfo.getDataAsString("wq_single")));
        }

        if (res.getReport().hasProblems()) {
            facets.add(new ReportFacet(ComputeType.ADVANCE, hash, id));
        }

        return res;
    }


    public static String createWTitle(CallContext cc, String name, boolean isQ) {
        String[] parts = name.split("=");

        NumberFormat nf = Formatter.getWaterlevelW(cc);

        double v;

        try {
            v = Double.valueOf(parts[1]);
        }
        catch (NumberFormatException nfe) {
            logger.warn("Cannot parse Double of: '" + parts[1] + "'");
            return name;
        }

        String prefix = null;

        if (isQ) {
            prefix = "Q=";
        }

        return prefix == null
            ? "W(" + nf.format(v) + ")"
            : "W(" + prefix + nf.format(v) + ")";
    }


    public static String createQTitle(CallContext cc, String name, boolean isQ) {
        String[] parts = name.split("=");

        NumberFormat nf = Formatter.getWaterlevelQ(cc);

        double v;

        try {
            v = Double.valueOf(parts[1]);
        }
        catch (NumberFormatException nfe) {
            logger.warn("Cannot parse Double of: '" + parts[1] + "'");
            return name;
        }

        String prefix = null;

        if (!isQ) {
            prefix = "W=";
        }

        return prefix == null
            ? "Q(" + nf.format(v) + ")"
            : "Q(" + prefix + nf.format(v) + ")";
    }


    /**
     * @param context Ignored.
     */
    @Override
    public Object computeFeed(
        FLYSArtifact artifact,
        String       hash,
        CallContext  context,
        List<Facet>  facets,
        Object       old
    ) {
        return compute((WINFOArtifact) artifact, context, hash, facets, old);

    }


    /**
     * @param context Ignored.
     */
    @Override
    public Object computeAdvance(
        FLYSArtifact artifact,
        String       hash,
        CallContext  context,
        List<Facet>  facets,
        Object       old
    ) {
        return compute((WINFOArtifact) artifact, context, hash, facets, old);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org