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 :