felix@6667: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde felix@6667: * Software engineering by Intevation GmbH felix@6667: * felix@6667: * This file is Free Software under the GNU AGPL (>=v3) felix@6667: * and comes with ABSOLUTELY NO WARRANTY! Check out the felix@6667: * documentation coming with Dive4Elements River for details. felix@6667: */ felix@6667: rrenkert@6217: package org.dive4elements.river.exports.minfo; rrenkert@6217: rrenkert@6217: import java.io.IOException; rrenkert@6217: import java.io.OutputStream; rrenkert@6217: import java.text.NumberFormat; teichmann@7913: import java.util.ArrayList; rrenkert@6217: import java.util.List; aheinecke@6242: import java.util.Map; aheinecke@6242: import java.util.HashMap; aheinecke@6242: import java.util.Locale; aheinecke@6242: import java.util.Date; aheinecke@6242: import java.text.DateFormat; rrenkert@6217: rrenkert@6217: import org.apache.log4j.Logger; aheinecke@6242: import org.apache.commons.lang.StringUtils; aheinecke@6242: aheinecke@6242: import net.sf.jasperreports.engine.JasperExportManager; aheinecke@6242: import net.sf.jasperreports.engine.JasperFillManager; aheinecke@6242: import net.sf.jasperreports.engine.JasperPrint; aheinecke@6242: import net.sf.jasperreports.engine.JRException; aheinecke@6242: aheinecke@6242: import org.dive4elements.artifacts.CallMeta; aheinecke@6242: import org.dive4elements.river.artifacts.D4EArtifact; aheinecke@6242: import org.dive4elements.river.artifacts.access.BedDifferencesAccess; teichmann@7915: import org.dive4elements.river.artifacts.access.RiverAccess; aheinecke@6242: import org.dive4elements.artifacts.common.utils.Config; aheinecke@6242: import org.dive4elements.river.artifacts.resources.Resources; rrenkert@6217: import org.dive4elements.river.artifacts.model.CalculationResult; rrenkert@7831: import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult; rrenkert@6217: import org.dive4elements.river.artifacts.model.minfo.BedDifferencesResult; aheinecke@6242: import org.dive4elements.river.artifacts.model.minfo.BedDifferenceJRDataSource; rrenkert@6217: import org.dive4elements.river.exports.AbstractExporter; rrenkert@6217: import org.dive4elements.river.utils.Formatter; aheinecke@6242: rrenkert@6217: import au.com.bytecode.opencsv.CSVWriter; rrenkert@6217: rrenkert@6217: public class BedDifferenceExporter rrenkert@6217: extends AbstractExporter rrenkert@6217: { rrenkert@6217: teichmann@8202: /** Private log. */ teichmann@8202: private static Logger log = rrenkert@6217: Logger.getLogger(BedDifferenceExporter.class); rrenkert@6217: aheinecke@6242: private static final String CSV_HEADER_KM = aheinecke@6242: "export.minfo.beddifference.km"; aheinecke@6242: rrenkert@6217: private static final String CSV_HEADER_DIFF = rrenkert@6217: "export.minfo.beddifference.diff"; rrenkert@6217: teichmann@7913: private static final String CSV_HEADER_DIFF_PAIR = teichmann@7913: "export.minfo.beddifference.diff.pair"; teichmann@7913: rrenkert@7831: private static final String CSV_HEADER_MORPH1 = rrenkert@7831: "export.minfo.beddifference.morph1"; rrenkert@7831: rrenkert@7831: private static final String CSV_HEADER_MORPH2 = rrenkert@7831: "export.minfo.beddifference.morph2"; rrenkert@7831: aheinecke@6242: public static final String JASPER_FILE = aheinecke@6242: "export.minfo.beddifference.pdf.file"; aheinecke@6242: aheinecke@6242: public static final String PDF_TITLE= aheinecke@6242: "export.minfo.beddifference.pdf.title"; aheinecke@6242: aheinecke@6242: public static final String PDF_HEADER_MODE= aheinecke@6242: "export.minfo.beddifference.pdf.mode"; aheinecke@6242: rrenkert@6217: private BedDifferencesResult[] results; rrenkert@6217: teichmann@7077: public BedDifferenceExporter() { rrenkert@6217: results = new BedDifferencesResult[0]; rrenkert@6217: } aheinecke@6242: rrenkert@6217: @Override rrenkert@6217: protected void writeCSVData(CSVWriter writer) throws IOException { rrenkert@6217: writeCSVHeader(writer); rrenkert@6217: rrenkert@6217: NumberFormat kmf = Formatter.getCalculationKm(context.getMeta()); rrenkert@6217: NumberFormat mf = Formatter.getMeterFormat(context); felix@6681: for (BedDifferencesResult result : results) { rrenkert@7831: if (result instanceof BedDiffYearResult) { rrenkert@7831: BedDiffYearResult yResult = (BedDiffYearResult) result; teichmann@7913: String desc = result.getDiffDescription(); rrenkert@7831: double[][] kms = yResult.getDifferencesData(); rrenkert@7831: double[][] morph1 = yResult.getMorphWidth1Data(); rrenkert@7831: double[][] morph2 = yResult.getMorphWidth2Data(); rrenkert@7831: for (int j = 0; j < kms[0].length; j++) { rrenkert@7831: writer.writeNext(new String[] { rrenkert@7831: kmf.format(kms[0][j]), tom@7914: desc, rrenkert@7831: mf.format(kms[1][j]), rrenkert@7831: mf.format(morph1[1][j]), teichmann@7913: mf.format(morph2[1][j]), tom@7914: }); rrenkert@7831: } rrenkert@7831: } rrenkert@7831: else { rrenkert@7831: double[][] kms = result.getDifferencesData(); teichmann@7913: String desc = result.getDiffDescription(); rrenkert@7831: for (int j = 0; j < kms[0].length; j++) { rrenkert@7831: writer.writeNext(new String[] { rrenkert@7831: kmf.format(kms[0][j]), tom@7914: desc, teichmann@7913: mf.format(kms[1][j]), tom@7914: }); rrenkert@7831: } rrenkert@6217: } rrenkert@6217: } rrenkert@6217: } rrenkert@6217: rrenkert@6217: @Override rrenkert@6217: protected void addData(Object data) { rrenkert@6217: if (!(data instanceof CalculationResult)) { teichmann@8202: log.warn("Invalid data type."); rrenkert@6217: return; rrenkert@6217: } rrenkert@6217: Object[] d = (Object[])((CalculationResult)data).getData(); rrenkert@6217: rrenkert@6217: if (!(d instanceof BedDifferencesResult[])) { teichmann@8202: log.warn("Invalid result object."); rrenkert@6217: return; rrenkert@6217: } rrenkert@6217: results = (BedDifferencesResult[])d; rrenkert@6217: } rrenkert@6217: aheinecke@6242: protected void addMetaData(BedDifferenceJRDataSource source) { aheinecke@6242: CallMeta meta = context.getMeta(); aheinecke@6242: aheinecke@6242: D4EArtifact arti = (D4EArtifact) master; aheinecke@6242: teichmann@7915: //source.addMetaData ("river", RiverUtils.getRivername(arti)); teichmann@7915: source.addMetaData ("river", new RiverAccess(arti).getRiverName()); aheinecke@6242: aheinecke@6242: Locale locale = Resources.getLocale(meta); aheinecke@6242: DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); aheinecke@6242: aheinecke@6242: source.addMetaData("date", df.format(new Date())); aheinecke@6242: aheinecke@6242: source.addMetaData("calculation", Resources.getMsg( aheinecke@6242: locale, aheinecke@6242: PDF_HEADER_MODE, aheinecke@6242: "Bedheight difference")); aheinecke@6242: aheinecke@6242: // Now the dynamic parts aheinecke@6242: aheinecke@6242: BedDifferencesAccess access = new BedDifferencesAccess(arti); aheinecke@6242: aheinecke@6242: source.addMetaData("differences", StringUtils.join( aheinecke@6242: access.getDifferenceArtifactNamePairs(), "\n")); teichmann@7908: tom@7916: source.addMetaData("kmheader", tom@7916: msg(CSV_HEADER_KM, "km")); teichmann@7915: source.addMetaData("diffpairheader", teichmann@7915: msg(CSV_HEADER_DIFF_PAIR, "Difference pair")); tom@7916: source.addMetaData("diffheader", msg(CSV_HEADER_DIFF, "cm")); tom@7916: source.addMetaData("morph1header", tom@7916: msg(CSV_HEADER_MORPH1, "Morph. active width minuend")); tom@7916: source.addMetaData("morph2header", tom@7916: msg(CSV_HEADER_MORPH2, "Morph. active width subtrahend")); aheinecke@6242: } aheinecke@6242: aheinecke@6242: rrenkert@6217: protected void writeCSVHeader(CSVWriter writer) { teichmann@8202: log.debug("writeCSVHeader()"); rrenkert@6217: teichmann@7913: List header = new ArrayList(); rrenkert@6217: if (results != null) { rrenkert@6217: header.add(msg(CSV_HEADER_KM, "km")); tom@7914: header.add(msg(CSV_HEADER_DIFF_PAIR, "difference pair")); tom@7906: header.add(msg(CSV_HEADER_DIFF, "cm")); rrenkert@7831: if (results.length > 0 && rrenkert@7831: results[0] instanceof BedDiffYearResult) { rrenkert@7831: header.add(msg(CSV_HEADER_MORPH1, "morph width minuend [m]")); rrenkert@7831: header.add(msg(CSV_HEADER_MORPH2, "morph width subtrahend [m]")); rrenkert@7831: } rrenkert@6217: } rrenkert@6217: writer.writeNext(header.toArray(new String[header.size()])); rrenkert@6217: } aheinecke@6242: aheinecke@6242: protected BedDifferenceJRDataSource createJRData() { aheinecke@6242: BedDifferenceJRDataSource source = new BedDifferenceJRDataSource(); aheinecke@6242: aheinecke@6242: addMetaData(source); aheinecke@6242: NumberFormat kmf = Formatter.getCalculationKm(context.getMeta()); aheinecke@6242: NumberFormat mf = Formatter.getMeterFormat(context); aheinecke@6242: for (BedDifferencesResult result: results) { tom@7916: BedDiffYearResult yResult = (BedDiffYearResult) result; aheinecke@6242: double[][] kms = result.getDifferencesData(); teichmann@7915: String desc = result.getDiffDescription(); tom@7916: double[][] morph1 = yResult.getMorphWidth1Data(); tom@7916: double[][] morph2 = yResult.getMorphWidth2Data(); aheinecke@6242: for (int j = 0; j < kms[0].length; j++) { aheinecke@6242: source.addData(new String[] { teichmann@7915: kmf.format(kms[0][j]), tom@7916: desc, teichmann@7915: mf.format(kms[1][j]), tom@7916: mf.format(morph1[1][j]), tom@7916: mf.format(morph2[1][j]) tom@7916: }); aheinecke@6242: } aheinecke@6242: } aheinecke@6242: return source; aheinecke@6242: } aheinecke@6242: aheinecke@6242: @Override aheinecke@6242: protected void writePDF(OutputStream out) { teichmann@8202: log.debug("write PDF"); aheinecke@6242: BedDifferenceJRDataSource source = createJRData(); aheinecke@6242: aheinecke@6242: String jasperFile = Resources.getMsg( aheinecke@6242: context.getMeta(), aheinecke@6242: JASPER_FILE, aheinecke@6242: "/jasper/beddifference_en.jasper"); aheinecke@6242: String confPath = Config.getConfigDirectory().toString(); aheinecke@6242: aheinecke@6242: teichmann@7915: Map parameters = new HashMap(); aheinecke@6242: parameters.put("ReportTitle", Resources.getMsg( aheinecke@6242: context.getMeta(), PDF_TITLE, "Exported Data")); aheinecke@6242: try { aheinecke@6242: JasperPrint print = JasperFillManager.fillReport( aheinecke@6242: confPath + jasperFile, aheinecke@6242: parameters, aheinecke@6242: source); aheinecke@6242: JasperExportManager.exportReportToPdfStream(print, out); aheinecke@6242: } aheinecke@6242: catch(JRException je) { teichmann@8202: log.warn("Error generating PDF Report!", je); aheinecke@6242: } aheinecke@6242: } rrenkert@6217: } felix@6681: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :