view artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedQualityGenerator.java @ 7076:7f600001c807 generator-refactoring

Add LTR inversion code to diagram generator. This code is used in serveral diagrams and as it modifies a whole diagram it should be central. (This should also make maintenance easier). This function can be called by processors to make sure that their data is plotted with an LTR waterflow.
author Andre Heinecke <aheinecke@intevation.de>
date Fri, 20 Sep 2013 16:33:22 +0200
parents e0311aa32efb
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.exports.minfo;

import org.apache.log4j.Logger;
import org.jfree.data.xy.XYSeries;

import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.model.minfo.BedDiameterData;
import org.dive4elements.river.artifacts.model.minfo.BedDiameterResult;
import org.dive4elements.river.artifacts.model.minfo.BedParametersResult;
import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterResult;
import org.dive4elements.river.exports.StyledSeriesBuilder;
import org.dive4elements.river.exports.XYChartGenerator;
import org.dive4elements.river.jfree.RiverAnnotation;
import org.dive4elements.river.jfree.StyledXYSeries;
import org.dive4elements.river.themes.ThemeDocument;


/**
 * An OutGenerator that generates bed quality charts.
 *
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class BedQualityGenerator extends XYChartGenerator implements FacetTypes {

    public enum YAXIS {
        W(0), P(1), D(2);

        protected int idx;

        private YAXIS(int c) {
            idx = c;
        }
    }

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

    public static final String I18N_CHART_TITLE = "chart.bedquality.title";
    public static final String I18N_XAXIS_LABEL = "chart.bedquality.xaxis.label";
    public static final String I18N_YAXIS_LABEL = "chart.bedquality.yaxis.label";
    public static final String I18N_SECOND_YAXIS_LABEL = "chart.bedquality.yaxis.label.porosity";
    public static final String I18N_THIRD_YAXIS_LABEL = "chart.bedquality.yaxis.label.diameter";

    public static final String I18N_CHART_TITLE_DEFAULT = "Sohlen Längsschnitt";
    public static final String I18N_XAXIS_LABEL_DEFAULT = "Fluss-Km";
    public static final String I18N_YAXIS_LABEL_DEFAULT = "Durchmesser [mm]";
    public static final String I18N_SECOND_YAXIS_LABEL_DEFAULT = "Porosität [%]";
    public static final String I18N_THIRD_YAXIS_LABEL_DEFAULT = "Dichte [t/m^3]";

    @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() {
        return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT);
    }

    /**
     * Get internationalized label for the x axis.
     */
    @Override
    protected String getDefaultXAxisLabel() {
        return msg(I18N_XAXIS_LABEL,
            I18N_XAXIS_LABEL_DEFAULT,
            new Object[] {getRiverName()});
    }

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

        if (index == YAXIS.W.idx) {
            label = getWAxisLabel();
        }
        else if (index == YAXIS.P.idx) {
            label = getPAxisLabel();
        }
        else if (index == YAXIS.D.idx) {
            label = getDAxisLabel();
        }

        return label;
    }

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

    /**
     * Get internationalized label for the y axis displaying the porosity.
     */
    protected String getPAxisLabel() {
        return msg(I18N_SECOND_YAXIS_LABEL, I18N_SECOND_YAXIS_LABEL_DEFAULT);
    }

    /**
     * Get internationalized label for the y axis displaying the density.
     */
    protected String getDAxisLabel() {
        return msg(I18N_THIRD_YAXIS_LABEL, I18N_THIRD_YAXIS_LABEL_DEFAULT);
    }

    /**
     * Produce output.
     *
     * @param artifactAndFacet
     *            current facet.
     * @param attr
     *            theme for facet
     */
    @Override
    public void doOut(
        ArtifactAndFacet artifactAndFacet,
        ThemeDocument attr,
        boolean visible
    ) {
        String name = artifactAndFacet.getFacetName();

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

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

        Facet facet = artifactAndFacet.getFacet();

        if (facet == null) {
            return;
        }

        // TODO BED_QUALITY_BED_DIAMETER_TOPLAYER
        if (name.equals(BED_QUALITY_BED_DIAMETER_TOPLAYER)) {
            doBedDiameterTopLayerOut(
                (BedDiameterResult) artifactAndFacet.getData(context),
                artifactAndFacet, attr, visible);
        }
        else if (name.equals(BED_QUALITY_BED_DIAMETER_SUBLAYER)) {
            doBedDiameterSubLayerOut(
                (BedDiameterResult) artifactAndFacet.getData(context),
                artifactAndFacet, attr, visible);
        }
        // TODO BED_QUALITY_BED_DIAMETER_SUBLAYER
        else if (name.equals(BED_QUALITY_BEDLOAD_DIAMETER)) {
            doBedLoadDiameterOut(
                (BedloadDiameterResult) artifactAndFacet.getData(context),
                artifactAndFacet, attr, visible);
        }
        else if (name.equals(BED_QUALITY_POROSITY_TOPLAYER)) {
            doPorosityTopLayerOut(
                (BedParametersResult) artifactAndFacet.getData(context),
                artifactAndFacet, attr, visible);
        }
        else if (name.equals(BED_QUALITY_POROSITY_SUBLAYER)) {
            doPorositySubLayerOut(
                (BedParametersResult) artifactAndFacet.getData(context),
                artifactAndFacet, attr, visible);
        }
        else if (name.equals(BED_QUALITY_SEDIMENT_DENSITY_TOPLAYER)) {
            doDensityTopLayerOut(
                (BedParametersResult) artifactAndFacet.getData(context),
                artifactAndFacet, attr, visible);
        }
        else if (name.equals(BED_QUALITY_SEDIMENT_DENSITY_SUBLAYER)) {
            doDensitySubLayerOut(
                (BedParametersResult) artifactAndFacet.getData(context),
                artifactAndFacet, attr, visible);
        }
        else if (name.equals(BED_DIAMETER_DATA_TOP) ||
                 name.equals(BED_DIAMETER_DATA_SUB) ||
                 name.equals(BEDLOAD_DIAMETER_DATA)) {
            doBedDiameterDataOut(
                (BedDiameterData) artifactAndFacet.getData(context),
                artifactAndFacet, attr, visible);
        }
        else if (name.equals(LONGITUDINAL_ANNOTATION)) {
            doAnnotations(
                (RiverAnnotation) artifactAndFacet.getData(context),
                 artifactAndFacet,
                 attr,
                 visible);
        }
        else if (FacetTypes.IS.MANUALPOINTS(name)) {
            doPoints(artifactAndFacet.getData(context), artifactAndFacet, attr,
                visible, YAXIS.W.idx);
        }
        else {
            logger.warn("Unknown facet name: " + name);
            return;
        }
    }

    private void doBedDiameterDataOut(
        BedDiameterData data,
        ArtifactAndFacet aandf,
        ThemeDocument theme,
        boolean visible
    ) {
        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
        StyledSeriesBuilder.addPoints(series, data.getDiameterData(), true);

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

    protected void doBedDiameterTopLayerOut(BedDiameterResult data,
        ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) {
        logger.debug("BedQuality.doBedDiameterTopLayerOut");

        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
        StyledSeriesBuilder.addPoints(series, data.getDiameterCapData(), true);

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

    protected void doBedDiameterSubLayerOut(BedDiameterResult data,
        ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) {
        logger.debug("BedQuality.doBedDiameterSubLayerOut");

        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
        StyledSeriesBuilder.addPoints(series, data.getDiameterSubData(), true);

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

    protected void doBedLoadDiameterOut(BedloadDiameterResult data,
        ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) {
        logger.debug("BedQuality.doBedLoadDiameterOut");

        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
        StyledSeriesBuilder.addPoints(series, data.getDiameterData(), true);

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

    protected void doPorosityTopLayerOut(BedParametersResult data,
        ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) {
        logger.debug("BedQuality.doPorosityTopLayerOut");

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

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

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

    protected void doPorositySubLayerOut(BedParametersResult data,
        ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) {
        logger.debug("BedQuality.doPorositySubLayerOut");

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

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

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

    protected void doDensityTopLayerOut(BedParametersResult data,
        ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) {
        logger.debug("BedQuality.doDensityOut");

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

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

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

    protected void doDensitySubLayerOut(BedParametersResult data,
        ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) {
        logger.debug("BedQuality.doDensityOut");

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

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

        addAxisSeries(series, YAXIS.D.idx, visible);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org