raimund@3880: package de.intevation.flys.exports.minfo; raimund@3880: raimund@3880: import gnu.trove.TDoubleArrayList; raimund@3880: raimund@3880: import java.io.IOException; raimund@3880: import java.io.OutputStream; raimund@3880: import java.text.DateFormat; raimund@3880: import java.text.NumberFormat; raimund@3880: import java.util.Arrays; raimund@3880: import java.util.LinkedList; raimund@3880: import java.util.List; raimund@3880: raimund@3880: import org.apache.log4j.Logger; raimund@3880: import org.w3c.dom.Document; raimund@3880: raimund@3880: import au.com.bytecode.opencsv.CSVWriter; raimund@3880: import de.intevation.artifacts.CallContext; raimund@3880: import de.intevation.flys.artifacts.model.CalculationResult; raimund@3880: import de.intevation.flys.artifacts.model.minfo.BedDiameterResult; raimund@3880: import de.intevation.flys.artifacts.model.minfo.BedParametersResult; raimund@3880: import de.intevation.flys.artifacts.model.minfo.BedQualityResult; raimund@3880: import de.intevation.flys.artifacts.model.minfo.BedloadDiameterResult; raimund@3880: import de.intevation.flys.exports.AbstractExporter; raimund@3880: import de.intevation.flys.utils.Formatter; raimund@3880: raimund@3880: raimund@3880: public class BedQualityExporter raimund@3880: extends AbstractExporter raimund@3880: { raimund@3880: /** Private logger. */ raimund@3880: private static Logger logger = Logger.getLogger(BedQualityExporter.class); raimund@3880: raimund@3880: private static final String CSV_HEADER_KM = "export.minfo.bedquality.km"; raimund@3880: private static final String CSV_HEADER_DENSITY_CAP = raimund@3880: "export.minfo.bedquality.density_cap"; raimund@3880: private static final String CSV_HEADER_DENSITY_SUB = raimund@3880: "export.minfo.bedquality.density_sub"; raimund@3880: private static final String CSV_HEADER_POROSITY_CAP = raimund@3880: "export.minfo.bedquality.porosity_cap"; raimund@3880: private static final String CSV_HEADER_POROSITY_SUB = raimund@3880: "export.minfo.bedquality.porosity_sub"; raimund@3880: private static final String CSV_HEADER_BEDLOAD = raimund@3880: "export.minfo.bedquality.bedload"; raimund@3880: private static final String CSV_HEADER_BED_CAP = raimund@3880: "export.minfo.bedquality.bed_cap"; raimund@3880: private static final String CSV_HEADER_BED_SUB = raimund@3880: "export.minfo.bedquality.bed_sub"; raimund@3880: raimund@3880: private BedQualityResult[] results; raimund@3880: raimund@3880: @Override raimund@3880: public void init(Document request, OutputStream out, CallContext context) { raimund@3880: logger.debug("BedQualityExporter.init"); raimund@3880: super.init(request, out, context); raimund@3880: results = new BedQualityResult[0]; raimund@3880: } raimund@3880: raimund@3880: @Override raimund@3880: protected void writeCSVData(CSVWriter writer) throws IOException { raimund@3880: // TODO Auto-generated method stub raimund@3880: writeCSVHeader(writer); raimund@3880: raimund@3880: NumberFormat kmf = Formatter.getCalculationKm(context.getMeta()); raimund@3880: raimund@3880: TDoubleArrayList kms = new TDoubleArrayList(); raimund@3880: int cols = 1; raimund@3880: for (int i = 0; i < results.length; i++) { raimund@3880: BedDiameterResult[] beds = results[i].getBedResults(); raimund@3880: for (int j = 0; j < beds.length; j++) { raimund@3880: TDoubleArrayList bkms = beds[j].getKms(); raimund@3880: for (int k = 0; k < bkms.size(); k++) { raimund@3880: if (!kms.contains(bkms.get(k))) { raimund@3880: kms.add(bkms.get(k)); raimund@3880: } raimund@3880: } raimund@3880: } raimund@3880: BedloadDiameterResult[] loads = results[i].getBedloadResults(); raimund@3880: for (int j = 0; j < loads.length; j++) { raimund@3880: TDoubleArrayList lkms = loads[i].getKms(); raimund@3880: for (int k = 0; k < lkms.size(); k++) { raimund@3880: if (!kms.contains(lkms.get(k))) { raimund@3880: kms.add(lkms.get(k)); raimund@3880: } raimund@3880: } raimund@3880: } raimund@3880: cols += beds.length * 2; raimund@3880: cols += loads.length; raimund@3880: if (beds.length > 0) { raimund@3880: cols += 4; raimund@3880: } raimund@3880: } raimund@3880: raimund@3880: kms.sort(); raimund@3880: List rows = new LinkedList(); raimund@3880: for (int i = 0; i < kms.size(); i++) { raimund@3880: double[] row = new double[cols]; raimund@3880: double km = kms.get(i); raimund@3880: row[0] = km; raimund@3880: for (int j = 0; j < results.length; j++) { raimund@3880: BedloadDiameterResult[] loads = results[j].getBedloadResults(); raimund@3880: raimund@3880: for(int k = 0; k < loads.length; k++) { raimund@3880: // k + 1: shift km column. raimund@3880: // j* loads.length: shift periods. raimund@3880: row[(k + 1) + (j * loads.length)] = raimund@3880: loads[k].getDiameter(km); raimund@3880: } raimund@3880: BedDiameterResult[] beds = results[j].getBedResults(); raimund@3880: for (int k = 0; k < beds.length; k++) { raimund@3880: // k + 1: shift km column. raimund@3880: // j * beds.length: shift periods. raimund@3880: // loads.length * results.length: shift bed load columns. raimund@3880: int ndx = (k + 1) + (j * beds.length) + (loads.length * results.length); raimund@3880: row[ndx] = beds[k].getDiameterCap(km); raimund@3880: row[ndx + 1] = beds[k].getDiameterSub(km); raimund@3880: } raimund@3880: BedParametersResult[] params = results[j].getParameters(); raimund@3880: for(int k = 0; k < params.length; k++) { raimund@3880: // loads.length + (beds.lenght * 2) * (j + 1): shift bed and bedload columns. raimund@3880: int ndx = 1 + (loads.length + (beds.length * 2) * (j + 1)); raimund@3880: row[ndx] = params[k].getLoadDensityCap(km); raimund@3880: row[ndx + 1] = params[k].getLoadDensitySub(km); raimund@3880: row[ndx + 2] = params[k].getPorosityCap(km); raimund@3880: row[ndx + 3] = params[k].getPorositySub(km); raimund@3880: } raimund@3880: } raimund@3880: rows.add(row); raimund@3880: } raimund@3880: for (double[] d : rows) { raimund@3880: logger.debug(Arrays.toString(d)); raimund@3880: List cells = new LinkedList(); raimund@3880: for (int i = 0; i < d.length; i++) { raimund@3880: if (!Double.isNaN(d[i])) { raimund@3880: NumberFormat nf = Formatter.getFormatter(context, 1, 3); raimund@3880: cells.add(nf.format(d[i])); raimund@3880: } raimund@3880: else { raimund@3880: cells.add(""); raimund@3880: } raimund@3880: } raimund@3880: writer.writeNext(cells.toArray(new String[cells.size()])); raimund@3880: } raimund@3880: } raimund@3880: raimund@3880: @Override raimund@3880: protected void writePDF(OutputStream out) { raimund@3880: // TODO Auto-generated method stub raimund@3880: raimund@3880: } raimund@3880: raimund@3880: @Override raimund@3880: protected void addData(Object data) { raimund@3880: // TODO Auto-generated method stub raimund@3880: logger.debug("addData()"); raimund@3880: if (!(data instanceof CalculationResult)) { raimund@3880: logger.warn("Invalid data type."); raimund@3880: return; raimund@3880: } raimund@3880: Object[] d = (Object[])((CalculationResult)data).getData(); raimund@3880: raimund@3880: if (!(d instanceof BedQualityResult[])) { raimund@3880: logger.warn("Invalid result object."); raimund@3880: return; raimund@3880: } raimund@3880: results = (BedQualityResult[])d; raimund@3880: } raimund@3880: raimund@3880: protected void writeCSVHeader(CSVWriter writer) { raimund@3880: logger.debug("writeCSVHeader()"); raimund@3880: raimund@3880: List header = new LinkedList(); raimund@3880: if (results != null) { raimund@3880: header.add(msg(CSV_HEADER_KM, "km")); raimund@3880: for (int i = 0; i < results.length; i++) { raimund@3880: DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy"); raimund@3880: String d1 = df.format(results[i].getDateRange().getFrom()); raimund@3880: String d2 = df.format(results[i].getDateRange().getTo()); raimund@3880: BedloadDiameterResult[] loads = results[i].getBedloadResults(); raimund@3880: BedDiameterResult[] beds = results[i].getBedResults(); raimund@3880: BedParametersResult[] params = results[i].getParameters(); raimund@3880: for (int j = 0; j < loads.length; j++) { raimund@3880: header.add(msg(CSV_HEADER_BEDLOAD, CSV_HEADER_BEDLOAD) + raimund@3880: " - " + raimund@3880: msg(loads[j].getType().toString(), raimund@3880: loads[j].getType().toString()) + " - " + raimund@3880: d1 + "-" + d2); raimund@3880: } raimund@3880: for (int j = 0; j < beds.length; j++) { raimund@3880: header.add(msg(CSV_HEADER_BED_CAP, CSV_HEADER_BED_CAP) + " - " + raimund@3880: msg(beds[j].getType().toString(), raimund@3880: beds[j].getType().toString()) + " - " + raimund@3880: d1 + "-" + d2); raimund@3880: header.add(msg(CSV_HEADER_BED_SUB, CSV_HEADER_BED_SUB) + " - " + raimund@3880: msg(beds[j].getType().toString(), raimund@3880: beds[j].getType().toString()) + " - " + raimund@3880: d1 + "-" + d2); raimund@3880: } raimund@3880: if (params.length > 0) { raimund@3880: header.add( raimund@3880: msg(CSV_HEADER_DENSITY_CAP, CSV_HEADER_DENSITY_CAP));// + raimund@3880: //" - " + d1 + "-" + d2); raimund@3880: header.add( raimund@3880: msg(CSV_HEADER_DENSITY_SUB, CSV_HEADER_DENSITY_SUB)); //+ raimund@3880: //" - " + d1 + "-" + d2); raimund@3880: header.add( raimund@3880: msg(CSV_HEADER_POROSITY_CAP, CSV_HEADER_POROSITY_CAP)); //+ raimund@3880: //" - " + d1 + "-" + d2); raimund@3880: header.add( raimund@3880: msg(CSV_HEADER_POROSITY_SUB, CSV_HEADER_POROSITY_SUB));// + raimund@3880: //" - " + d1 + "-" + d2); raimund@3880: } raimund@3880: } raimund@3880: } raimund@3880: writer.writeNext(header.toArray(new String[header.size()])); raimund@3880: } raimund@3880: }