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; rrenkert@6217: import java.util.LinkedList; 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: rrenkert@6217: import org.dive4elements.artifacts.CallContext; aheinecke@6242: import org.dive4elements.artifacts.CallMeta; aheinecke@6242: import org.dive4elements.river.artifacts.D4EArtifact; aheinecke@6242: import org.dive4elements.river.artifacts.access.BedDifferencesAccess; 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@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: import org.dive4elements.river.utils.RiverUtils; aheinecke@6242: rrenkert@6217: import org.w3c.dom.Document; rrenkert@6217: rrenkert@6217: import au.com.bytecode.opencsv.CSVWriter; rrenkert@6217: rrenkert@6217: rrenkert@6217: public class BedDifferenceExporter rrenkert@6217: extends AbstractExporter rrenkert@6217: { rrenkert@6217: rrenkert@6217: /** Private logger. */ rrenkert@6217: private static Logger logger = 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: 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: rrenkert@6217: @Override rrenkert@6217: public void init(Document request, OutputStream out, CallContext context) { aheinecke@6242: logger.debug("init"); rrenkert@6217: super.init(request, out, context); 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@6217: double[][] kms = result.getDifferencesData(); rrenkert@6217: for (int j = 0; j < kms[0].length; j++) { rrenkert@6217: writer.writeNext(new String[] { rrenkert@6217: kmf.format(kms[0][j]), mf.format(kms[1][j])}); rrenkert@6217: } rrenkert@6217: } rrenkert@6217: } rrenkert@6217: rrenkert@6217: @Override rrenkert@6217: protected void addData(Object data) { rrenkert@6217: if (!(data instanceof CalculationResult)) { rrenkert@6217: logger.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[])) { rrenkert@6217: logger.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: aheinecke@6242: source.addMetaData ("river", RiverUtils.getRivername(arti)); 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: source.addMetaData("ye_mode", Resources.getMsg(locale, aheinecke@6242: "state.minfo." + access.getYearEpoch(), aheinecke@6242: access.getYearEpoch())); aheinecke@6242: aheinecke@6242: source.addMetaData("differences", StringUtils.join( aheinecke@6242: access.getDifferenceArtifactNamePairs(), "\n")); aheinecke@6242: } aheinecke@6242: aheinecke@6242: rrenkert@6217: protected void writeCSVHeader(CSVWriter writer) { rrenkert@6217: logger.debug("writeCSVHeader()"); rrenkert@6217: rrenkert@6217: List header = new LinkedList(); rrenkert@6217: if (results != null) { rrenkert@6217: header.add(msg(CSV_HEADER_KM, "km")); rrenkert@6217: header.add(msg(CSV_HEADER_DIFF, "m")); 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) { aheinecke@6242: double[][] kms = result.getDifferencesData(); aheinecke@6242: for (int j = 0; j < kms[0].length; j++) { aheinecke@6242: source.addData(new String[] { aheinecke@6242: kmf.format(kms[0][j]), mf.format(kms[1][j])}); aheinecke@6242: } aheinecke@6242: } aheinecke@6242: return source; aheinecke@6242: } aheinecke@6242: aheinecke@6242: @Override aheinecke@6242: protected void writePDF(OutputStream out) { aheinecke@6242: logger.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: aheinecke@6242: 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) { aheinecke@6242: logger.warn("Error generating PDF Report!", je); aheinecke@6242: } aheinecke@6242: } aheinecke@6242: rrenkert@6217: } felix@6681: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :