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; andre@8643: import java.util.Collections; 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; andre@8584: import org.dive4elements.river.artifacts.access.RangeAccess; 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@8422: private static final String CSV_HEADER_SOUNDING1 = rrenkert@8422: "export.minfo.beddifference.sounding1"; rrenkert@8422: rrenkert@8422: private static final String CSV_HEADER_SOUNDING2 = rrenkert@8422: "export.minfo.beddifference.sounding2"; rrenkert@8422: rrenkert@8422: private static final String CSV_HEADER_GAP1 = rrenkert@8422: "export.minfo.beddifference.gap1"; rrenkert@8422: rrenkert@8422: private static final String CSV_HEADER_GAP2 = rrenkert@8422: "export.minfo.beddifference.gap2"; rrenkert@8422: 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: andre@8643: protected List data2StringArrays() { andre@8643: NumberFormat kmf = Formatter.getCalculationKm(context.getMeta()); andre@8643: NumberFormat mf = Formatter.getMeterFormat(context); andre@8643: D4EArtifact arti = (D4EArtifact) master; andre@8643: RangeAccess access = new RangeAccess(arti); andre@8643: andre@8643: List retval = new ArrayList(); andre@8643: andre@8643: for (BedDifferencesResult result : results) { andre@8643: BedDiffYearResult yResult = (BedDiffYearResult) result; andre@8643: String desc = result.getDiffDescription(); andre@8643: double[][] kms = yResult.getDifferencesData(); andre@8643: double[][] sounding1 = yResult.getSoundingWidth1Data(); andre@8643: double[][] sounding2 = yResult.getSoundingWidth2Data(); andre@8643: double[][] gap1 = yResult.getDataGap1Data(); andre@8643: double[][] gap2 = yResult.getDataGap2Data(); andre@8643: andre@8643: for (int j = 0; j < kms[0].length; j++) { andre@8643: String sound1 = !Double.isNaN(sounding1[1][j]) andre@8643: ? mf.format(sounding1[1][j]) andre@8643: : ""; andre@8643: String sound2 = !Double.isNaN(sounding2[1][j]) andre@8643: ? mf.format(sounding2[1][j]) andre@8643: : ""; andre@8643: String g1 = !Double.isNaN(gap1[1][j]) andre@8643: ? mf.format(gap1[1][j]) andre@8643: : ""; andre@8643: String g2 = !Double.isNaN(gap2[1][j]) andre@8643: ? mf.format(gap2[1][j]) andre@8643: : ""; andre@8643: retval.add(new String[] { andre@8643: kmf.format(kms[0][j]), andre@8643: desc, andre@8643: mf.format(kms[1][j]), andre@8643: sound1, andre@8643: sound2, andre@8643: g1, andre@8643: g2 andre@8643: }); andre@8643: } andre@8643: } andre@8643: if (access.getFrom() > access.getTo()) { andre@8643: Collections.reverse(retval); andre@8643: } andre@8643: return retval; andre@8643: } rrenkert@6217: @Override rrenkert@6217: protected void writeCSVData(CSVWriter writer) throws IOException { rrenkert@6217: writeCSVHeader(writer); rrenkert@6217: andre@8643: writer.writeAll(data2StringArrays()); 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", new RiverAccess(arti).getRiverName()); aheinecke@6242: aheinecke@6242: Locale locale = Resources.getLocale(meta); aheinecke@6242: DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); andre@8584: NumberFormat kmf = Formatter.getWaterlevelKM(context); andre@8584: andre@8584: RangeAccess rangeAccess = new RangeAccess(arti); andre@8584: double[] kms = rangeAccess.getKmRange(); andre@8584: source.addMetaData("range", andre@8584: kmf.format(kms[0]) + " - " + kmf.format(kms[kms.length-1])); 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: BedDifferencesAccess access = new BedDifferencesAccess(arti); aheinecke@6242: aheinecke@6242: source.addMetaData("differences", StringUtils.join( aheinecke@6242: access.getDifferenceArtifactNamePairs(), "\n")); teichmann@7908: tom@8438: source.addMetaData("kmheader", msg(CSV_HEADER_KM)); tom@8438: source.addMetaData("diffpairheader", msg(CSV_HEADER_DIFF_PAIR)); tom@8438: source.addMetaData("diffheader", msg(CSV_HEADER_DIFF)); tom@8438: source.addMetaData("sounding1header", msg(CSV_HEADER_SOUNDING1)); tom@8438: source.addMetaData("sounding2header", msg(CSV_HEADER_SOUNDING2)); tom@8438: source.addMetaData("gap1header", msg(CSV_HEADER_GAP1)); tom@8438: source.addMetaData("gap2header", msg(CSV_HEADER_GAP2)); 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@8422: header.add(msg(CSV_HEADER_SOUNDING1, "soundung width minuend [m]")); rrenkert@8422: header.add(msg(CSV_HEADER_SOUNDING2, "sounding width subtrahend [m]")); rrenkert@8422: header.add(msg(CSV_HEADER_GAP1, "data gap minuend")); rrenkert@8422: header.add(msg(CSV_HEADER_GAP2, "data gap subtrahend")); 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); andre@8643: for (String[] str: data2StringArrays()) { andre@8643: source.addData(str); 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 :