felix@6668: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde felix@6668: * Software engineering by Intevation GmbH felix@6668: * felix@6668: * This file is Free Software under the GNU AGPL (>=v3) felix@6668: * and comes with ABSOLUTELY NO WARRANTY! Check out the felix@6668: * documentation coming with Dive4Elements River for details. felix@6668: */ felix@6668: felix@6668: package org.dive4elements.river.exports.minfo; felix@6668: felix@6668: import java.util.LinkedList; felix@6668: import java.util.List; felix@6685: import java.util.TreeSet; felix@6668: felix@6668: import java.io.OutputStream; felix@6668: import java.io.IOException; felix@6668: felix@6668: import java.text.NumberFormat; felix@6668: felix@6668: import org.w3c.dom.Document; felix@6668: felix@6668: import org.apache.log4j.Logger; felix@6668: felix@6668: import org.dive4elements.artifacts.CallContext; felix@6668: felix@6668: import org.dive4elements.river.artifacts.model.CalculationResult; felix@6685: import org.dive4elements.river.artifacts.model.minfo.SedimentLoad; felix@6685: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadFraction; felix@6668: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadResult; felix@6668: felix@6668: import org.dive4elements.river.exports.AbstractExporter; felix@6668: felix@6668: import org.dive4elements.river.utils.Formatter; felix@6668: felix@6668: import au.com.bytecode.opencsv.CSVWriter; felix@6668: felix@6676: felix@6759: /** felix@6759: * Do CSV export for sediment load calculations (will also be shown in felix@6676: * client). */ felix@6668: public class SedimentLoadExporter felix@6668: extends AbstractExporter felix@6668: { felix@6668: /** Private logger. */ felix@6668: private static Logger logger = Logger.getLogger(SedimentLoadExporter.class); felix@6668: felix@6685: // i18n keys. felix@6685: public static final String CSV_KM = felix@6685: "export.sedimentload_ls.csv.header.km"; felix@6668: felix@6685: public static final String CSV_YEAR = felix@6685: "export.sedimentload_ls.csv.header.year"; felix@6685: felix@6685: public static final String CSV_COARSE = felix@6685: "export.sedimentload_ls.csv.header.coarse"; felix@6685: felix@6685: public static final String CSV_FINEMIDDLE = felix@6685: "export.sedimentload_ls.csv.header.finemiddle"; felix@6685: felix@6685: public static final String CSV_SAND = felix@6685: "export.sedimentload_ls.csv.header.sand"; felix@6685: felix@6685: public static final String CSV_SUSP_SAND = felix@6685: "export.sedimentload_ls.csv.header.suspsand"; felix@6685: felix@6759: public static final String CSV_SUSP_SAND_BB = felix@6759: "export.sedimentload_ls.csv.header.suspsandbb"; felix@6759: felix@6685: public static final String CSV_SUSP_SEDIMENT = felix@6685: "export.sedimentload_ls.csv.header.suspsediment"; felix@6685: felix@6685: public static final String CSV_TOTAL = felix@6685: "export.sedimentload_ls.csv.header.total"; felix@6685: felix@6685: felix@6685: /** Collected results. */ felix@6668: private SedimentLoadResult[] results; felix@6668: felix@6685: /** Empty constructor. */ felix@6668: public SedimentLoadExporter() { felix@6668: results = new SedimentLoadResult[0]; felix@6668: } felix@6668: felix@6668: /** Process all stored data and write csv. */ felix@6668: @Override felix@6668: protected void writeCSVData(CSVWriter writer) throws IOException { felix@6668: writeCSVHeader(writer); felix@6668: felix@6685: for (SedimentLoadResult result: results) { felix@6972: String years = (result.getEndYear() == 0) felix@6972: ? result.getStartYear() + " " felix@6963: : result.getStartYear() + "-" + result.getEndYear(); felix@6685: SedimentLoad load = result.getLoad(); felix@6685: // Put load.getName()+load.getDescription()}); somewhere? felix@6685: for (double km: new TreeSet(load.getKms())) { felix@6685: SedimentLoadFraction fraction = load.getFraction(km); felix@6963: writeRecord(writer, km, years, fraction); felix@6685: } felix@6685: } felix@6685: } felix@6685: felix@7018: felix@7018: /** Return space when val is NaN, apply NumberFormat otherwise. */ felix@7007: private String numberToString(NumberFormat valf, double val) { felix@7007: if (Double.isNaN(val)) { felix@7011: return " "; felix@7007: } felix@7007: return valf.format(val); felix@7007: } felix@7007: felix@7018: /** Return space when val is NaN or zero, apply NumberFormat otherwise. */ felix@7018: private String nonZeroToString(NumberFormat valf, double val) { felix@7018: if (Double.isNaN(val) || val == 0d) { felix@7018: return " "; felix@7018: } felix@7018: return valf.format(val); felix@7018: } felix@7018: felix@6685: /** Write a line. */ felix@6963: private void writeRecord( felix@6963: CSVWriter writer, felix@6963: double km, felix@6963: String years, felix@6963: SedimentLoadFraction fraction felix@6963: ) { felix@6685: // year, total, susp sed, susp sandbed suspsand, sand, finemiddle, coarse felix@6668: NumberFormat kmf = Formatter.getCalculationKm(context.getMeta()); felix@6685: NumberFormat valf = Formatter.getFormatter(context.getMeta(), 0, 2); felix@6685: writer.writeNext(new String[] { felix@6685: kmf.format(km), felix@6685: years, felix@7007: numberToString(valf, fraction.getSuspSediment()), felix@7007: numberToString(valf, fraction.getSuspSand()), felix@7007: numberToString(valf, fraction.getSuspSandBed()), felix@7007: numberToString(valf, fraction.getSand()), felix@7007: numberToString(valf, fraction.getFineMiddle()), felix@7007: numberToString(valf, fraction.getCoarse()), felix@7018: nonZeroToString(valf, fraction.getTotal()) felix@6685: }); felix@6668: } felix@6668: felix@6668: /** Writes i18ned header for csv file/stream. */ felix@6668: protected void writeCSVHeader(CSVWriter writer) { felix@6668: logger.debug("writeCSVHeader()"); felix@6668: felix@6668: List header = new LinkedList(); felix@6668: if (results != null) { felix@6759: header.add(msg(CSV_KM, "km")); felix@6759: header.add(msg(CSV_YEAR, "Jahr")); felix@6685: header.add(msg(CSV_SUSP_SEDIMENT, "Schwebst.")); felix@6759: header.add(msg(CSV_SUSP_SAND, "Susp.Sand")); felix@6759: header.add(msg(CSV_SUSP_SAND_BB, "Susp.Sand(BB)")); felix@6759: header.add(msg(CSV_SAND, "Sand")); felix@6759: header.add(msg(CSV_FINEMIDDLE, "Kies(f+m)")); felix@6759: header.add(msg(CSV_COARSE, "Kies(g)")); felix@6759: header.add(msg(CSV_TOTAL, "Gesamt")); felix@6668: } felix@6668: writer.writeNext(header.toArray(new String[header.size()])); felix@6668: } felix@6668: felix@6668: /** Store data internally, accepting only SedimentLoadResults[] in felix@6668: * calculationresults data. */ felix@6668: @Override felix@6668: protected void addData(Object data) { felix@6668: if (!(data instanceof CalculationResult)) { felix@6668: logger.warn("Invalid data type."); felix@6668: return; felix@6668: } felix@6668: Object[] d = (Object[])((CalculationResult)data).getData(); felix@6668: felix@6668: if (!(d instanceof SedimentLoadResult[])) { felix@6668: logger.warn("Invalid result object."); felix@6668: return; felix@6668: } felix@6668: logger.debug("addData: Data added."); felix@6668: results = (SedimentLoadResult[])d; felix@6668: } felix@6668: felix@6685: /** Write PDF to outputstream (not implemented yet). */ felix@6668: @Override felix@6668: protected void writePDF(OutputStream out) { felix@6668: logger.warn("Not implemented."); felix@6668: } felix@6668: } felix@6668: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :