ingo@389: package de.intevation.flys.exports;
ingo@389:
ingo@446: import java.io.IOException;
ingo@389: import java.io.OutputStream;
ingo@418: import java.text.NumberFormat;
ingo@389: import java.util.ArrayList;
ingo@389: import java.util.List;
ingo@389:
ingo@389: import org.w3c.dom.Document;
ingo@389:
ingo@389: import org.apache.log4j.Logger;
ingo@389:
ingo@389: import au.com.bytecode.opencsv.CSVWriter;
ingo@389:
ingo@389: import de.intevation.artifacts.Artifact;
ingo@389: import de.intevation.artifacts.CallContext;
ingo@389:
ingo@389: import de.intevation.flys.artifacts.WINFOArtifact;
ingo@389: import de.intevation.flys.artifacts.model.WQKms;
ingo@445: import de.intevation.flys.utils.Formatter;
ingo@389:
ingo@389:
ingo@389: /**
ingo@389: * @author Ingo Weinzierl
ingo@389: */
ingo@391: public class WaterlevelExporter extends AbstractExporter {
ingo@389:
ingo@389: /** The logger used in this exporter.*/
ingo@389: private static Logger logger = Logger.getLogger(WaterlevelExporter.class);
ingo@389:
ingo@389:
ingo@446: public static final String FACET_WST = "wst";
ingo@446:
ingo@446:
ingo@416: public static final String CSV_KM_HEADER =
ingo@416: "export.waterlevel.csv.header.km";
ingo@416:
ingo@416: public static final String CSV_W_HEADER =
ingo@416: "export.waterlevel.csv.header.w";
ingo@416:
ingo@416: public static final String CSV_Q_HEADER =
ingo@416: "export.waterlevel.csv.header.q";
ingo@416:
ingo@416: public static final String DEFAULT_CSV_KM_HEADER = "Fluss-Km";
ingo@416: public static final String DEFAULT_CSV_W_HEADER = "W [NN + m]";
ingo@416: public static final String DEFAULT_CSV_Q_HEADER = "Q [m³/s]";
ingo@416:
ingo@416:
ingo@389: /** The storage that contains all WQKms objects for the different facets.*/
ingo@389: protected List data;
ingo@389:
ingo@389:
ingo@389: public void init(Document request, OutputStream out, CallContext context) {
ingo@389: logger.debug("WaterlevelExporter.init");
ingo@389:
ingo@391: super.init(request, out, context);
ingo@389:
ingo@391: this.data = new ArrayList();
ingo@389: }
ingo@389:
ingo@389:
ingo@446: @Override
ingo@446: public void generate()
ingo@446: throws IOException
ingo@446: {
ingo@446: logger.debug("WaterlevelExporter.generate");
ingo@446:
ingo@446: if (facet != null && facet.equals(AbstractExporter.FACET_CSV)) {
ingo@446: generateCSV();
ingo@446: }
ingo@446: else if (facet != null && facet.equals(FACET_WST)) {
ingo@446: generateWST();
ingo@446: }
ingo@446: else {
ingo@446: throw new IOException("invalid facet for exporter");
ingo@446: }
ingo@446: }
ingo@446:
ingo@446:
ingo@391: protected void addData(Artifact artifact) {
ingo@391: data.add(getWaterlevelData(artifact));
ingo@389: }
ingo@389:
ingo@389:
ingo@389: /**
ingo@389: * Returns the waterlevel data computed by the WINFOArtifact.
ingo@389: *
ingo@389: * @param artifact The WINFOArtifact.
ingo@389: *
ingo@389: * @return the computed waterlevel data.
ingo@389: */
ingo@389: protected WQKms[] getWaterlevelData(Artifact artifact) {
ingo@389: WINFOArtifact winfoArtifact = (WINFOArtifact) artifact;
ingo@389: WQKms[] wqkms = winfoArtifact.getWaterlevelData();
ingo@389:
ingo@389: logger.debug("Got " + wqkms.length + " WQKms objects.");
ingo@389:
ingo@389: return wqkms;
ingo@389: }
ingo@389:
ingo@389:
ingo@391: protected void writeCSVData(CSVWriter writer) {
ingo@391: logger.info("WaterlevelExporter.writeData");
ingo@389:
ingo@416: writeCSVHeader(writer);
ingo@416:
ingo@389: for (WQKms[] tmp: data) {
ingo@389: for (WQKms wqkms: tmp) {
ingo@389: wQKms2CSV(writer, wqkms);
ingo@389: }
ingo@389: }
ingo@389: }
ingo@389:
ingo@389:
ingo@416: protected void writeCSVHeader(CSVWriter writer) {
ingo@416: logger.info("WaterlevelExporter.writeCSVHeader");
ingo@416:
ingo@416: writer.writeNext(new String[] {
ingo@416: msg(CSV_KM_HEADER, DEFAULT_CSV_KM_HEADER),
ingo@416: msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER),
ingo@416: msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER)
ingo@416: });
ingo@416: }
ingo@416:
ingo@416:
ingo@389: protected void wQKms2CSV(CSVWriter writer, WQKms wqkms) {
ingo@389: logger.debug("WaterlevelExporter.wQKms2CSV");
ingo@389:
ingo@418: NumberFormat kmf = getKmFormatter();
ingo@418: NumberFormat wf = getWFormatter();
ingo@418: NumberFormat qf = getQFormatter();
ingo@418:
ingo@389: int size = wqkms.size();
ingo@389: double[] result = new double[3];
ingo@389:
ingo@389: for (int i = 0; i < size; i ++) {
ingo@389: result = wqkms.get(i, result);
ingo@389:
ingo@389: writer.writeNext(new String[] {
ingo@418: kmf.format(result[2]),
ingo@418: wf.format(result[0]),
ingo@418: qf.format(result[1])
ingo@389: });
ingo@389: }
ingo@389: }
ingo@418:
ingo@418:
ingo@418: /**
ingo@446: * Generates the output in WST format.
ingo@446: */
ingo@446: protected void generateWST()
ingo@446: throws IOException
ingo@446: {
ingo@446: logger.info("WaterlevelExporter.generateWST");
ingo@446:
ingo@446: int cols = data.get(0).length;
ingo@446: WstWriter writer = new WstWriter(cols);
ingo@446:
ingo@446: writeWSTData(writer);
ingo@446:
ingo@446: writer.write(out);
ingo@446: }
ingo@446:
ingo@446:
ingo@446: protected void writeWSTData(WstWriter writer) {
ingo@446: logger.debug("WaterlevelExporter.writeWSTData");
ingo@446:
ingo@446: double[] result = new double[3];
ingo@446:
ingo@446: for (WQKms[] tmp: data) {
ingo@446: for (WQKms wqkms: tmp) {
ingo@446: int size = wqkms != null ? wqkms.size() : 0;
ingo@446:
ingo@450: addWSTColumn(writer, wqkms);
ingo@447:
ingo@446: for (int i = 0; i < size; i++) {
ingo@446: result = wqkms.get(i, result);
ingo@446:
ingo@446: writer.add(result);
ingo@446: }
ingo@446: }
ingo@446: }
ingo@446: }
ingo@446:
ingo@446:
ingo@450: protected void addWSTColumn(WstWriter writer, WQKms wqkms) {
ingo@450: writer.addColumn(wqkms.getName());
ingo@450: }
ingo@450:
ingo@450:
ingo@446: /**
ingo@418: * Returns the number formatter for kilometer values.
ingo@418: *
ingo@418: * @return the number formatter for kilometer values.
ingo@418: */
ingo@418: protected NumberFormat getKmFormatter() {
ingo@445: return Formatter.getWaterlevelKM(context);
ingo@418: }
ingo@418:
ingo@418:
ingo@418: /**
ingo@418: * Returns the number formatter for W values.
ingo@418: *
ingo@418: * @return the number formatter for W values.
ingo@418: */
ingo@418: protected NumberFormat getWFormatter() {
ingo@445: return Formatter.getWaterlevelW(context);
ingo@418: }
ingo@418:
ingo@418:
ingo@418: /**
ingo@418: * Returns the number formatter for Q values.
ingo@418: *
ingo@418: * @return the number formatter for Q values.
ingo@418: */
ingo@418: protected NumberFormat getQFormatter() {
ingo@445: return Formatter.getWaterlevelQ(context);
ingo@418: }
ingo@389: }
ingo@389: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :