view flys-artifacts/src/main/java/de/intevation/flys/exports/WaterlevelExporter.java @ 389:69d05357c177

Added an exporter (OutGenerator) for waterlevels which currently supports CSV exports. flys-artifacts/trunk@1810 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 03 May 2011 16:36:21 +0000
parents
children 5d6988836f01
line wrap: on
line source
package de.intevation.flys.exports;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Document;

import org.apache.log4j.Logger;

import au.com.bytecode.opencsv.CSVWriter;

import de.intevation.artifacts.Artifact;
import de.intevation.artifacts.CallContext;

import de.intevation.flys.artifacts.WINFOArtifact;
import de.intevation.flys.artifacts.model.WQKms;


/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class WaterlevelExporter implements OutGenerator {

    /** The logger used in this exporter.*/
    private static Logger logger = Logger.getLogger(WaterlevelExporter.class);


    public static final String WATERLEVEL_FACET_CSV = "waterlevel_export.csv";

    public static final String DEFAULT_CSV_CHARSET = "UTF-8";

    public static final char DEFAULT_CSV_SEPARATOR = ',';


    /** The document of the incoming out() request.*/
    protected Document request;

    /** The output stream where the data should be written to.*/
    protected OutputStream out;

    /** The CallContext object.*/
    protected CallContext context;

    /** The selected facet.*/
    protected String facet;

    /** The storage that contains all WQKms objects for the different facets.*/
    protected List<WQKms[]> data;


    public void init(Document request, OutputStream out, CallContext context) {
        logger.debug("WaterlevelExporter.init");

        this.request = request;
        this.out     = out;
        this.context = context;
        this.data    = new ArrayList<WQKms[]>();
    }


    /**
     * This doOut() just collects the data of multiple artifacts. The real data
     * generation takes place in the concrete generate() methods.
     *
     * @param artifact The artifact.
     * @param facet The facet to add - NOTE: the facet needs to fit to the first
     * facet inserted into this exporter. Otherwise this artifact/facet is
     * skipped.
     * @param attr The attr document.
     */
    public void doOut(Artifact artifact, String facet, Document attr) {
        logger.debug("WaterlevelExporter.doOut: " + facet);

        if (!isFacetValid(facet)) {
            logger.warn("Facet '" + facet + "' not valid. No output created!");
            return;
        }

        data.add(getWaterlevelData(artifact));
    }


    public void generate()
    throws IOException
    {
        if (facet != null && facet.equals(WATERLEVEL_FACET_CSV)) {
            generateCSV();
        }
        else {
            throw new IOException("invalid facet for exporter.");
        }
    }


    /**
     * Determines if the desired facet is valid for this exporter. If no facet
     * is currently set, <i>facet</i> is set.
     *
     * @param facet The desired facet.
     *
     * @return true, if <i>facet</i> is valid, otherwise false.
     */
    protected boolean isFacetValid(String facet) {
        logger.debug("WaterlevelExporter.isFacetValid");

        if (facet == null || facet.length() == 0) {
            return false;
        }
        else if (this.facet == null || this.facet.length() == 0) {
            logger.debug("Set the facet of this export: " + facet);
            this.facet = facet;

            return true;
        }
        else {
            return this.facet.equals(facet);
        }
    }


    /**
     * Returns the waterlevel data computed by the WINFOArtifact.
     *
     * @param artifact The WINFOArtifact.
     *
     * @return the computed waterlevel data.
     */
    protected WQKms[] getWaterlevelData(Artifact artifact) {
        WINFOArtifact winfoArtifact = (WINFOArtifact) artifact;
        WQKms[]       wqkms         = winfoArtifact.getWaterlevelData();

        logger.debug("Got " + wqkms.length + " WQKms objects.");

        return wqkms;
    }


    protected void generateCSV()
    throws    IOException
    {
        logger.info("WaterlevelExporter.generateCSV");

        CSVWriter writer = new CSVWriter(
            new OutputStreamWriter(
                out,
                DEFAULT_CSV_CHARSET),
            DEFAULT_CSV_SEPARATOR);

        for (WQKms[] tmp: data) {
            for (WQKms wqkms: tmp) {
                wQKms2CSV(writer, wqkms);
            }
        }

        writer.close();
    }


    protected void wQKms2CSV(CSVWriter writer, WQKms wqkms) {
        logger.debug("WaterlevelExporter.wQKms2CSV");

        int      size   = wqkms.size();
        double[] result = new double[3];

        for (int i = 0; i < size; i ++) {
            result = wqkms.get(i, result);

            writer.writeNext(new String[] {
                Double.toString(result[2]),
                Double.toString(result[0]),
                Double.toString(result[1])
            });
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org