ingo@2258: package de.intevation.flys.exports;
ingo@2258:
ingo@2258: import java.io.OutputStream;
ingo@2258: import java.text.NumberFormat;
ingo@2258: import java.text.DateFormat;
ingo@2258: import java.util.ArrayList;
ingo@2258: import java.util.Date;
ingo@2258: import java.util.List;
ingo@2258:
ingo@2258: import org.w3c.dom.Document;
ingo@2258:
ingo@2258: import org.apache.log4j.Logger;
ingo@2258:
ingo@2258: import au.com.bytecode.opencsv.CSVWriter;
ingo@2258:
ingo@2258: import de.intevation.artifacts.CallContext;
ingo@2258: import de.intevation.artifacts.CallMeta;
ingo@2258:
ingo@2258: import de.intevation.flys.artifacts.FLYSArtifact;
ingo@2258: import de.intevation.flys.artifacts.model.CalculationResult;
ingo@2258: import de.intevation.flys.artifacts.model.Timerange;
ingo@2258: import de.intevation.flys.artifacts.model.WQTimerange;
ingo@2258: import de.intevation.flys.artifacts.resources.Resources;
ingo@2258: import de.intevation.flys.utils.FLYSUtils;
ingo@2258: import de.intevation.flys.utils.Formatter;
ingo@2258:
ingo@2258:
ingo@2258: /**
ingo@2258: * @author Ingo Weinzierl
ingo@2258: */
ingo@2258: public class HistoricalDischargeCurveExporter extends AbstractExporter {
ingo@2258:
ingo@2258: private static final Logger logger =
ingo@2258: Logger.getLogger(HistoricalDischargeCurveExporter.class);
ingo@2258:
ingo@2258:
ingo@2258: public static final String CSV_TIMERANGE_HEADER =
ingo@2258: "export.historical.discharge.csv.header.timerange";
ingo@2258:
ingo@2258: public static final String CSV_WATERLEVEL_HEADER =
ingo@2258: "export.historical.discharge.csv.header.waterlevel";
ingo@2258:
ingo@2258: public static final String CSV_DISCHARGE_HEADER =
ingo@2258: "export.historical.discharge.csv.header.discharge";
ingo@2258:
ingo@2258: public static final String CSV_DIFF_HEADER =
ingo@2258: "export.historical.discharge.csv.header.diff";
ingo@2258:
ingo@2258: public static final String CSV_GAUGENAME_HEADER =
ingo@2258: "export.historical.discharge.csv.header.gaugename";
ingo@2258:
ingo@2258:
ingo@2258: protected List data;
ingo@2258:
ingo@2258:
ingo@2258: public void init(Document request, OutputStream out, CallContext cc) {
ingo@2258: super.init(request, out, cc);
ingo@2258:
ingo@2258: data = new ArrayList();
ingo@2258: }
ingo@2258:
ingo@2258:
ingo@2258: @Override
ingo@2258: protected void addData(Object d) {
ingo@2258: logger.debug("Add data of class: " + d.getClass());
ingo@2258:
ingo@2258: if (d instanceof CalculationResult) {
ingo@2258: d = ((CalculationResult) d).getData();
ingo@2258:
ingo@2258: logger.debug("Internal data of CalculationResult: " + d.getClass());
ingo@2258:
ingo@2258: if (d instanceof WQTimerange[]) {
ingo@2258: logger.debug("Add new data of type WQTimerange");
ingo@2258: data.add((WQTimerange[]) d);
ingo@2258: }
ingo@2258: }
ingo@2258: }
ingo@2258:
ingo@2258:
ingo@2258: @Override
ingo@2258: protected void writeCSVData(CSVWriter writer) {
ingo@2258: logger.info("HistoricalDischargeCurveExporter.writeCSVData");
ingo@2258: logger.debug("CSV gets " + data.size() + " WQTimerange[] objects.");
ingo@2258:
ingo@2258: writeCSVHeader(writer);
ingo@2258:
ingo@2258: for (WQTimerange[] arr: data) {
ingo@2258: for (WQTimerange wqt: arr) {
ingo@2258: wqt2CSV(writer, wqt);
ingo@2258: }
ingo@2258: }
ingo@2258: }
ingo@2258:
ingo@2258:
ingo@2258: @Override
ingo@2258: protected void writePDF(OutputStream out) {
ingo@2258: logger.warn("TODO: IMPLEMENT ME!");
ingo@2258: }
ingo@2258:
ingo@2258:
ingo@2258: protected void writeCSVHeader(CSVWriter writer) {
ingo@2258: writer.writeNext(new String[] {
ingo@2258: msg(CSV_TIMERANGE_HEADER, CSV_TIMERANGE_HEADER),
ingo@2258: msg(CSV_WATERLEVEL_HEADER, CSV_WATERLEVEL_HEADER),
ingo@2258: msg(CSV_DISCHARGE_HEADER, CSV_DISCHARGE_HEADER),
ingo@2258: msg(CSV_DIFF_HEADER, CSV_DIFF_HEADER),
ingo@2258: msg(CSV_GAUGENAME_HEADER, CSV_GAUGENAME_HEADER)
ingo@2258: });
ingo@2258: }
ingo@2258:
ingo@2258:
ingo@2258: protected void wqt2CSV(CSVWriter writer, WQTimerange wqt) {
ingo@2258: logger.debug("Add next WQTimerange to CSV");
ingo@2258:
ingo@2258: DateFormat df = Formatter.getShortDateFormat(context);
ingo@2258: NumberFormat wf = Formatter.getHistoricalDischargeW(context);
ingo@2258: NumberFormat qf = Formatter.getHistoricalDischargeQ(context);
ingo@2258:
ingo@2258: double[] wq = new double[2];
ingo@2258:
ingo@2258: String gaugeName = getReferenceGaugename();
ingo@2258:
ingo@2258: for (int i = 0, n = wqt.size(); i < n; i++) {
ingo@2258: Timerange tr = wqt.getTimerange(i);
ingo@2258: Date start = new Date(tr.getStart());
ingo@2258: Date end = new Date(tr.getEnd());
ingo@2258:
ingo@2258: wqt.get(i, wq);
ingo@2258:
ingo@2258: writer.writeNext(new String[] {
ingo@2258: df.format(start) + " - " + df.format(end),
ingo@2258: wf.format(wq[0]),
ingo@2258: qf.format(wq[1]),
ingo@2258: "TODO: Difference to reference curve",
ingo@2258: gaugeName
ingo@2258: });
ingo@2258: }
ingo@2258: }
ingo@2258:
ingo@2258:
ingo@2258: public String getReferenceGaugename() {
ingo@2258: return FLYSUtils.getReferenceGaugeName((FLYSArtifact) master);
ingo@2258: }
ingo@2258: }
ingo@2258: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :