teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.exports.minfo; ingo@3785: ingo@3785: import gnu.trove.TDoubleArrayList; ingo@3785: ingo@3785: import java.io.IOException; ingo@3785: import java.io.OutputStream; ingo@3785: import java.text.DateFormat; ingo@3785: import java.text.NumberFormat; ingo@3785: import java.util.Arrays; teichmann@7254: import java.util.ArrayList; ingo@3785: import java.util.List; ingo@3785: ingo@3785: import org.apache.log4j.Logger; ingo@3785: ingo@3785: import au.com.bytecode.opencsv.CSVWriter; teichmann@5831: import org.dive4elements.river.artifacts.model.CalculationResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedDiameterResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedParametersResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedQualityResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterResult; teichmann@5831: import org.dive4elements.river.exports.AbstractExporter; teichmann@5831: import org.dive4elements.river.utils.Formatter; ingo@3785: ingo@3785: ingo@3785: public class BedQualityExporter ingo@3785: extends AbstractExporter ingo@3785: { ingo@3785: /** Private logger. */ ingo@3785: private static Logger logger = Logger.getLogger(BedQualityExporter.class); ingo@3785: ingo@3785: private static final String CSV_HEADER_KM = "export.minfo.bedquality.km"; ingo@3785: private static final String CSV_HEADER_DENSITY_CAP = ingo@3785: "export.minfo.bedquality.density_cap"; ingo@3785: private static final String CSV_HEADER_DENSITY_SUB = ingo@3785: "export.minfo.bedquality.density_sub"; ingo@3785: private static final String CSV_HEADER_POROSITY_CAP = ingo@3785: "export.minfo.bedquality.porosity_cap"; ingo@3785: private static final String CSV_HEADER_POROSITY_SUB = ingo@3785: "export.minfo.bedquality.porosity_sub"; ingo@3785: private static final String CSV_HEADER_BEDLOAD = ingo@3785: "export.minfo.bedquality.bedload"; ingo@3785: private static final String CSV_HEADER_BED_CAP = ingo@3785: "export.minfo.bedquality.bed_cap"; ingo@3785: private static final String CSV_HEADER_BED_SUB = ingo@3785: "export.minfo.bedquality.bed_sub"; ingo@3785: ingo@3785: private BedQualityResult[] results; ingo@3785: teichmann@7077: public BedQualityExporter() { ingo@3785: results = new BedQualityResult[0]; ingo@3785: } ingo@3785: ingo@3785: @Override ingo@3785: protected void writeCSVData(CSVWriter writer) throws IOException { ingo@3785: // TODO Auto-generated method stub ingo@3785: writeCSVHeader(writer); ingo@3785: ingo@3785: NumberFormat kmf = Formatter.getCalculationKm(context.getMeta()); ingo@3785: ingo@3785: TDoubleArrayList kms = new TDoubleArrayList(); ingo@3785: int cols = 1; ingo@3785: for (int i = 0; i < results.length; i++) { ingo@3785: BedDiameterResult[] beds = results[i].getBedResults(); ingo@3785: for (int j = 0; j < beds.length; j++) { ingo@3785: TDoubleArrayList bkms = beds[j].getKms(); teichmann@7254: for (int k = 0, K = bkms.size(); k < K; k++) { teichmann@7254: double km = bkms.get(k); teichmann@7254: if (!kms.contains(km)) { // XXX: O(N^2) teichmann@7254: kms.add(km); ingo@3785: } ingo@3785: } ingo@3785: } ingo@3785: BedloadDiameterResult[] loads = results[i].getBedloadResults(); ingo@3785: for (int j = 0; j < loads.length; j++) { ingo@3785: TDoubleArrayList lkms = loads[i].getKms(); teichmann@7254: for (int k = 0, L = lkms.size(); k < L; k++) { teichmann@7254: double km = lkms.get(k); teichmann@7254: if (!kms.contains(km)) { // XXX: O(N^2) teichmann@7254: kms.add(km); ingo@3785: } ingo@3785: } ingo@3785: } ingo@3785: cols += beds.length * 2; ingo@3785: cols += loads.length; ingo@3785: if (beds.length > 0) { ingo@3785: cols += 4; ingo@3785: } ingo@3785: } ingo@3785: ingo@3785: kms.sort(); teichmann@7254: List rows = new ArrayList(kms.size()); teichmann@7254: for (int i = 0, K = kms.size(); i < K; i++) { ingo@3785: double[] row = new double[cols]; ingo@3785: double km = kms.get(i); ingo@3785: row[0] = km; ingo@3785: for (int j = 0; j < results.length; j++) { ingo@3785: BedloadDiameterResult[] loads = results[j].getBedloadResults(); ingo@3785: ingo@3785: for(int k = 0; k < loads.length; k++) { ingo@3785: // k + 1: shift km column. ingo@3785: // j* loads.length: shift periods. ingo@3785: row[(k + 1) + (j * loads.length)] = ingo@3785: loads[k].getDiameter(km); ingo@3785: } ingo@3785: BedDiameterResult[] beds = results[j].getBedResults(); ingo@3785: for (int k = 0; k < beds.length; k++) { ingo@3785: // k + 1: shift km column. ingo@3785: // j * beds.length: shift periods. ingo@3785: // loads.length * results.length: shift bed load columns. ingo@3785: int ndx = (k + 1) + (j * beds.length) + (loads.length * results.length); ingo@3785: row[ndx] = beds[k].getDiameterCap(km); ingo@3785: row[ndx + 1] = beds[k].getDiameterSub(km); ingo@3785: } rrenkert@6359: if (beds.length == 0) { rrenkert@6359: continue; rrenkert@6359: } ingo@3785: BedParametersResult[] params = results[j].getParameters(); ingo@3785: for(int k = 0; k < params.length; k++) { ingo@3785: // loads.length + (beds.lenght * 2) * (j + 1): shift bed and bedload columns. ingo@3785: int ndx = 1 + (loads.length + (beds.length * 2) * (j + 1)); ingo@3785: row[ndx] = params[k].getLoadDensityCap(km); ingo@3785: row[ndx + 1] = params[k].getLoadDensitySub(km); ingo@3785: row[ndx + 2] = params[k].getPorosityCap(km); ingo@3785: row[ndx + 3] = params[k].getPorositySub(km); ingo@3785: } ingo@3785: } ingo@3785: rows.add(row); ingo@3785: } ingo@3785: for (double[] d : rows) { ingo@3785: logger.debug(Arrays.toString(d)); teichmann@7254: List cells = new ArrayList(d.length); ingo@3785: for (int i = 0; i < d.length; i++) { ingo@3785: if (!Double.isNaN(d[i])) { ingo@3785: NumberFormat nf = Formatter.getFormatter(context, 1, 3); ingo@3785: cells.add(nf.format(d[i])); ingo@3785: } ingo@3785: else { ingo@3785: cells.add(""); ingo@3785: } ingo@3785: } ingo@3785: writer.writeNext(cells.toArray(new String[cells.size()])); ingo@3785: } ingo@3785: } ingo@3785: ingo@3785: @Override ingo@3785: protected void writePDF(OutputStream out) { ingo@3785: // TODO Auto-generated method stub ingo@3785: ingo@3785: } ingo@3785: ingo@3785: @Override ingo@3785: protected void addData(Object data) { ingo@3785: // TODO Auto-generated method stub ingo@3785: logger.debug("addData()"); ingo@3785: if (!(data instanceof CalculationResult)) { ingo@3785: logger.warn("Invalid data type."); ingo@3785: return; ingo@3785: } ingo@3785: Object[] d = (Object[])((CalculationResult)data).getData(); ingo@3785: ingo@3785: if (!(d instanceof BedQualityResult[])) { ingo@3785: logger.warn("Invalid result object."); ingo@3785: return; ingo@3785: } ingo@3785: results = (BedQualityResult[])d; ingo@3785: } ingo@3785: ingo@3785: protected void writeCSVHeader(CSVWriter writer) { ingo@3785: logger.debug("writeCSVHeader()"); ingo@3785: teichmann@7254: List header = new ArrayList(); ingo@3785: if (results != null) { ingo@3785: header.add(msg(CSV_HEADER_KM, "km")); ingo@3785: for (int i = 0; i < results.length; i++) { ingo@3785: DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy"); ingo@3785: String d1 = df.format(results[i].getDateRange().getFrom()); ingo@3785: String d2 = df.format(results[i].getDateRange().getTo()); ingo@3785: BedloadDiameterResult[] loads = results[i].getBedloadResults(); ingo@3785: BedDiameterResult[] beds = results[i].getBedResults(); ingo@3785: BedParametersResult[] params = results[i].getParameters(); ingo@3785: for (int j = 0; j < loads.length; j++) { ingo@3785: header.add(msg(CSV_HEADER_BEDLOAD, CSV_HEADER_BEDLOAD) + ingo@3785: " - " + ingo@3785: msg(loads[j].getType().toString(), ingo@3785: loads[j].getType().toString()) + " - " + ingo@3785: d1 + "-" + d2); ingo@3785: } ingo@3785: for (int j = 0; j < beds.length; j++) { ingo@3785: header.add(msg(CSV_HEADER_BED_CAP, CSV_HEADER_BED_CAP) + " - " + ingo@3785: msg(beds[j].getType().toString(), ingo@3785: beds[j].getType().toString()) + " - " + ingo@3785: d1 + "-" + d2); ingo@3785: header.add(msg(CSV_HEADER_BED_SUB, CSV_HEADER_BED_SUB) + " - " + ingo@3785: msg(beds[j].getType().toString(), ingo@3785: beds[j].getType().toString()) + " - " + ingo@3785: d1 + "-" + d2); ingo@3785: } rrenkert@6359: if (beds.length == 0) { rrenkert@6359: continue; rrenkert@6359: } ingo@3785: if (params.length > 0) { ingo@3785: header.add( raimund@3885: msg(CSV_HEADER_DENSITY_CAP, CSV_HEADER_DENSITY_CAP) + raimund@3885: " - " + d1 + "-" + d2); ingo@3785: header.add( raimund@3885: msg(CSV_HEADER_DENSITY_SUB, CSV_HEADER_DENSITY_SUB) + raimund@3885: " - " + d1 + "-" + d2); ingo@3785: header.add( raimund@3885: msg(CSV_HEADER_POROSITY_CAP, CSV_HEADER_POROSITY_CAP) + raimund@3885: " - " + d1 + "-" + d2); ingo@3785: header.add( raimund@3885: msg(CSV_HEADER_POROSITY_SUB, CSV_HEADER_POROSITY_SUB) + raimund@3885: " - " + d1 + "-" + d2); ingo@3785: } ingo@3785: } ingo@3785: } ingo@3785: writer.writeNext(header.toArray(new String[header.size()])); ingo@3785: } ingo@3785: }