view artifacts/src/main/java/org/dive4elements/river/exports/process/DischargeProcessor.java @ 6898:ebe7dfffacc4

DischargeProcessor: Handle main-values. Temporarily disable w/q data handling.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Thu, 22 Aug 2013 14:24:13 +0200
parents 34c04d877149
children 1b35b2ddfc28
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.process;

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

import org.apache.log4j.Logger;
import org.jfree.data.xy.XYSeries;
import org.w3c.dom.Document;

import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.model.WQKms;
import org.dive4elements.river.exports.DischargeCurveGenerator;
import org.dive4elements.river.exports.StyledSeriesBuilder;
import org.dive4elements.river.exports.XYChartGenerator;
import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation;
import org.dive4elements.river.jfree.RiverAnnotation;
import org.dive4elements.river.jfree.StyledXYSeries;
import org.dive4elements.river.utils.ThemeUtil;

import org.jfree.chart.annotations.XYTextAnnotation;


/** Helper for data handling in discharge diagrams. */
public class DischargeProcessor
implements   Processor, FacetTypes {

    private final static Logger logger =
            Logger.getLogger(DischargeProcessor.class);

    /** Station for which the diagram is shown. */
    private double km;

    /** Tolerance for comparison of kilometers. */
    public static final double KM_EPSILON = 0.001d;


    /** This processor needs to be constructed with a given km. */
    private DischargeProcessor() {
        km = Double.NaN;
    }


    public DischargeProcessor(double km) {
        this.km = km;
    }


    /** Process data, add it to plot. */
    @Override
    public void doOut(
            XYChartGenerator generator,
            ArtifactAndFacet aandf,
            Document theme,
            boolean visible,
            int index
    ) {
        CallContext context = generator.getCallContext();
        Object data = aandf.getData(context);
        if (false && data instanceof WQKms) {
            doWQKmsPointOut(
                generator, (WQKms) data, aandf, theme, visible, index);
            return;
        }
        else if (data instanceof RiverAnnotation) {
            if (!(generator instanceof DischargeCurveGenerator)) {
                logger.error("DischargeProcessor can only be used in " +
                    " in DischargeCurveGenerator-classes.");
                return;
            }
            DischargeCurveGenerator dGenerator =
                (DischargeCurveGenerator) generator;

            RiverAnnotation mainValues = (RiverAnnotation) data;
            dGenerator.translateRiverAnnotation(mainValues);
            dGenerator.doAnnotations(
                mainValues,
                aandf, theme, visible);
            return;
        }
        logger.error("Can't process " + data.getClass().getName() + " objects");
    }


    /** True if this processor knows how to deal with facetType. */
    @Override
    public boolean canHandle(String facetType) {
        return /*STATIC_WQKMS_W.equals(facetType)
            ||*/ COMPUTED_DISCHARGE_MAINVALUES_Q.equals(facetType)
            || MAINVALUES_Q.equals(facetType)
            || COMPUTED_DISCHARGE_MAINVALUES_W.equals(facetType)
            || MAINVALUES_W.equals(facetType);
    }


    /** The station of the current calculation/view. */
    protected double getKm() {
        return km;
    }


    /** Handle WQKms data by finding w/q values at given km. */
    protected void doWQKmsPointOut(XYChartGenerator generator,
        WQKms wqkms,
        ArtifactAndFacet aandf,
        Document theme,
        boolean visible,
        int axidx
    ) {
        String title = aandf.getFacetDescription();
        XYSeries series = new StyledXYSeries(
            title,
            theme);

        double[] kms = wqkms.getKms();

        for (int i = 0 ; i< kms.length; i++) {
            if (Math.abs(kms[i] - getKm()) <= KM_EPSILON) {
                series.add(wqkms.getQ(i), wqkms.getW(i));
                generator.addAxisSeries(series, axidx, visible);
                if(visible && ThemeUtil.parseShowPointLabel(theme)) {
                    List<XYTextAnnotation> textAnnos = new ArrayList<XYTextAnnotation>();
                    XYTextAnnotation anno = new CollisionFreeXYTextAnnotation(
                            title,
                            wqkms.getQ(i),
                            // TODO add a percentage to the extend of W axis
                            wqkms.getW(i));
                    textAnnos.add(anno);
                    RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, theme);
                    flysAnno.setTextAnnotations(textAnnos);
                    generator.addAnnotations(flysAnno);
                }
                return;
            }
        }

        logger.warn("No WQ found for km " + getKm());
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org