view flys-artifacts/src/main/java/de/intevation/flys/exports/FlowVelocityGenerator.java @ 4282:8b4988815974

Added marker for Ws and Qs in Historical Discharge WQ charts. Therefore, the XYChartGenerator got two new methods addDomainMarker(Marker, boolean) and addValueMarker(Marker, boolean). The boolean parameters determine, if the marker should be visible or not. This is analogous to addAxisSeries(XYSeries, int, boolean).
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 29 Oct 2012 05:59:27 +0100
parents 3dc26ec2558d
children 146f1894e6a6
line wrap: on
line source
package de.intevation.flys.exports;

import org.apache.log4j.Logger;

import org.jfree.data.xy.XYSeries;

import org.w3c.dom.Document;

import de.intevation.artifactdatabase.state.ArtifactAndFacet;
import de.intevation.artifactdatabase.state.Facet;

import de.intevation.flys.artifacts.FLYSArtifact;

import de.intevation.flys.artifacts.model.FacetTypes;
import de.intevation.flys.artifacts.model.FlowVelocityData;

import de.intevation.flys.jfree.FLYSAnnotation;
import de.intevation.flys.jfree.StyledXYSeries;

import de.intevation.flys.utils.FLYSUtils;



/**
 * An OutGenerator that generates flow velocity curves.
 *
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class FlowVelocityGenerator
extends      XYChartGenerator
implements   FacetTypes
{
    public enum YAXIS {
        V(0),
        T(1);
        protected int idx;
        private YAXIS(int c) {
           idx = c;
        }
    }

    /** The logger that is used in this generator. */
    private static Logger logger = Logger.getLogger(FlowVelocityGenerator.class);

    /** Key to look up internationalized String for annotations label. */
    public static final String I18N_ANNOTATIONS_LABEL =
        "chart.flow_velocity.annotations.label";

    /**
     * Key to look up internationalized String for LongitudinalSection diagrams
     * titles.
     */
    public static final String I18N_CHART_TITLE =
        "chart.flow_velocity.section.title";

    /**
     * Key to look up internationalized String for LongitudinalSection diagrams
     * subtitles.
     */
    public static final String I18N_CHART_SUBTITLE =
        "chart.flow_velocity.section.subtitle";

    /**
     * Key to look up internationalized String for LongitudinalSection diagrams
     * short subtitles.
     */
    public static final String I18N_CHART_SHORT_SUBTITLE =
        "chart.flow_velocity.section.shortsubtitle";

    public static final String I18N_XAXIS_LABEL =
        "chart.flow_velocity.section.xaxis.label";

    public static final String I18N_YAXIS_LABEL =
        "chart.flow_velocity.section.yaxis.label";

    public static final String I18N_2YAXIS_LABEL =
        "chart.flow_velocity.section.yaxis.second.label";

    public static final String I18N_CHART_TITLE_DEFAULT  = "Geschwindigkeit- und Schubspannung";
    public static final String I18N_XAXIS_LABEL_DEFAULT  = "km";
    public static final String I18N_YAXIS_LABEL_DEFAULT  = "Geschwindigkeit v [m/s]";
    public static final String I18N_2YAXIS_LABEL_DEFAULT = "Schubspannung Tau [N]";



    @Override
    protected YAxisWalker getYAxisWalker() {
        return new YAxisWalker() {
            @Override
            public int length() {
                return YAXIS.values().length;
            }

            @Override
            public String getId(int idx) {
                YAXIS[] yaxes = YAXIS.values();
                return yaxes[idx].toString();
            }
        };
    }


    /**
     * Returns the default title for this chart.
     *
     * @return the default title for this chart.
     */
    @Override
    public String getDefaultChartTitle() {
        Object[] args = new Object[] {
            getRiverName()
        };

        return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT, args);
    }


    /**
     * Get internationalized label for the x axis.
     */
    @Override
    protected String getDefaultXAxisLabel() {
        FLYSArtifact flys = (FLYSArtifact) master;

        return msg(
            I18N_XAXIS_LABEL,
            I18N_XAXIS_LABEL_DEFAULT,
            new Object[] { FLYSUtils.getRiver(flys).getName() });
    }


    @Override
    protected String getDefaultYAxisLabel(int index) {
        String label = "default";

        if (index == YAXIS.V.idx) {
            label = getVAxisLabel();
        }
        else if (index == YAXIS.T.idx) {
            label = getTAxisLabel();
        }

        return label;
    }


    /**
     * Get internationalized label for the y axis.
     */
    protected String getVAxisLabel() {
        return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
    }


    /**
     * Get internationalized label for the y axis.
     */
    protected String getTAxisLabel() {
        return msg(I18N_2YAXIS_LABEL, I18N_2YAXIS_LABEL_DEFAULT);
    }


    /**
     * Produce output.
     * @param artifactAndFacet current facet.
     * @param attr  theme for facet
     * @param visible Whether this facets data is actually visible or not.
     */
    public void doOut(
        ArtifactAndFacet artifactAndFacet,
        Document         attr,
        boolean          visible
    ) {
        String name = artifactAndFacet.getFacetName();

        logger.debug("FlowVelocityGenerator.doOut: " + name);

        if (name == null) {
            logger.error("No facet name for doOut(). No output generated!");
            return;
        }

        Facet facet = artifactAndFacet.getFacet();

        if (facet == null) {
            return;
        }

        if (name.equals(FLOW_VELOCITY_MAINCHANNEL)) {
            doMainChannelOut(
                (FlowVelocityData) artifactAndFacet.getData(context),
                artifactAndFacet,
                attr,
                visible);
        }
        else if (name.equals(FLOW_VELOCITY_TOTALCHANNEL)) {
            doTotalChannelOut(
                (FlowVelocityData) artifactAndFacet.getData(context),
                artifactAndFacet,
                attr,
                visible);
        }
        else if (name.equals(FLOW_VELOCITY_TAU)) {
            doTauOut(
                (FlowVelocityData) artifactAndFacet.getData(context),
                artifactAndFacet,
                attr,
                visible);
        }
        else if (name.equals(FLOW_VELOCITY_ANNOTATION)) {
            doAnnotations(
                (FLYSAnnotation) artifactAndFacet.getData(context),
                 artifactAndFacet,
                 attr,
                 visible);
        }
        else if (FacetTypes.IS.AREA(name)) {
            doArea(
                artifactAndFacet.getData(context),
                artifactAndFacet,
                attr,
                visible);
        }
        else if (FacetTypes.IS.MANUALPOINTS(name)) {
            doPoints(
                artifactAndFacet.getData(context),
                artifactAndFacet,
                attr,
                visible,
                YAXIS.V.idx);
        }
        else {
            logger.warn("Unknown facet name: " + name);
            return;
        }
    }


    /**
     * Process the output for W facets in a longitudinal section curve.
     *
     * @param data A FlowVelocityData object
     * @param aandf The facet. This facet does NOT support any data objects. Use
     * FLYSArtifact.getNativeFacet() instead to retrieve a Facet which supports
     * data.
     * @param theme The theme that contains styling information.
     * @param visible The visibility of the curve.
     */
    protected void doMainChannelOut(
        FlowVelocityData data,
        ArtifactAndFacet aandf,
        Document         theme,
        boolean          visible
    ) {
        logger.debug("FlowVelocityGenerator.doMainChannelOut");

        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);

        StyledSeriesBuilder.addPoints(series, data.getMainChannelPoints(), true);

        addAxisSeries(series, YAXIS.V.idx, visible);
    }


    /**
     * Add items to dataseries which describes the differences.
     */
    protected void doTotalChannelOut(
        FlowVelocityData data,
        ArtifactAndFacet aandf,
        Document         theme,
        boolean          visible
    ) {
        logger.debug("FlowVelocityGenerator.doTotalChannelOut");

        if (data == null) {
            logger.warn("No data to add to FlowVelocity chart.");
            return;
         }

        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);

        StyledSeriesBuilder.addPoints(series, data.getTotalChannelPoints(), true);

        addAxisSeries(series, YAXIS.V.idx, visible);
    }



    /**
     * @param data A FlowVelocityData object
     * @param aandf The facet. This facet does NOT support any data objects. Use
     * FLYSArtifact.getNativeFacet() instead to retrieve a Facet which supports
     * data.
     * @param theme The theme that contains styling information.
     * @param visible The visibility of the curve.
     */
    protected void doTauOut(
        FlowVelocityData data,
        ArtifactAndFacet aandf,
        Document         theme,
        boolean          visible
    ) {
        logger.debug("FlowVelocityGenerator.doTauOut");

        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);

        StyledSeriesBuilder.addPoints(series, data.getTauPoints(), true);

        addAxisSeries(series, YAXIS.T.idx, visible);
    }


    /** Look up the axis identifier for a given facet type. */
    public int axisIdxForFacet(String facetName) {
        if (FacetTypes.IS.V(facetName)) {
            return YAXIS.V.idx;
        }
        else if (FacetTypes.IS.T(facetName)) {
            return YAXIS.T.idx;
        }
        else {
            logger.warn("Could not find axis for facet " + facetName);
            return YAXIS.V.idx;
        }
    }


    /**
     * Do Area out.
     * @param theme styling information.
     * @param visible whether or not visible.
     */
    protected void doArea(
        Object     o,
        ArtifactAndFacet aandf,
        Document   theme,
        boolean    visible
    ) {
        logger.debug("FlowVelocityGenerator.doArea");
        logger.warn("TODO: Implement FlowVelocityGenerator.doArea");
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org