felix@1161: package de.intevation.flys.exports; felix@1161: felix@1161: import java.io.IOException; felix@1161: import java.io.OutputStream; felix@1161: import java.text.NumberFormat; felix@1161: import java.util.ArrayList; felix@1161: import java.util.List; raimund@2180: import java.util.Map; raimund@2180: import java.util.HashMap; raimund@2180: import java.util.Date; raimund@2180: import java.text.DateFormat; raimund@2180: import java.util.Locale; felix@1161: felix@1161: import org.w3c.dom.Document; felix@1161: felix@1161: import org.apache.log4j.Logger; felix@1161: felix@1161: import au.com.bytecode.opencsv.CSVWriter; felix@1161: raimund@2180: import net.sf.jasperreports.engine.JasperExportManager; raimund@2180: import net.sf.jasperreports.engine.JasperFillManager; raimund@2180: import net.sf.jasperreports.engine.JasperPrint; raimund@2180: import net.sf.jasperreports.engine.JRException; raimund@2180: felix@1161: import de.intevation.artifacts.CallContext; raimund@2180: import de.intevation.artifacts.CallMeta; raimund@2185: import de.intevation.artifacts.common.utils.Config; raimund@2180: raimund@2180: import de.intevation.flys.artifacts.WINFOArtifact; felix@1161: felix@1161: import de.intevation.flys.artifacts.model.CalculationResult; felix@1161: import de.intevation.flys.artifacts.model.WKms; raimund@2180: import de.intevation.flys.artifacts.model.WKmsJRDataSource; raimund@2180: import de.intevation.flys.artifacts.resources.Resources; felix@1161: raimund@2180: import de.intevation.flys.utils.FLYSUtils; felix@1161: import de.intevation.flys.utils.Formatter; felix@1161: felix@1161: /** felix@1161: * (CSV)Exporter for WDifferences. felix@1161: */ felix@1161: public class WDifferencesExporter extends AbstractExporter { felix@1161: felix@1161: /** The logger used in this exporter. */ felix@1161: private static Logger logger = Logger.getLogger(WDifferencesExporter.class); felix@1161: felix@1161: felix@1705: public static final String WDIFF_CSV_KM_HEADER = felix@1161: "export.w_differences.csv.header.km"; felix@1161: felix@1705: public static final String WDIFF_CSV_W_HEADER = felix@1161: "export.w_differences.csv.header.w"; felix@1161: felix@1705: public static final String WDIFF_DEFAULT_CSV_KM_HEADER = "Fluss-Km"; felix@1705: public static final String WDIFF_DEFAULT_CSV_W_HEADER = "m"; felix@1161: raimund@2180: public static final String PDF_HEADER_MODE = "export.wdifferences.pdf.mode"; raimund@2185: public static final String JASPER_FILE = "export.wdifferences.pdf.file"; felix@1161: felix@1161: /** The storage that contains all WKms objects for the different facets. */ felix@1161: protected List data; felix@1161: felix@1161: felix@1161: public void init(Document request, OutputStream out, CallContext context) { felix@1161: logger.debug("WDifferencesExporter.init"); felix@1161: felix@1161: super.init(request, out, context); felix@1161: felix@1161: this.data = new ArrayList(); felix@1161: } felix@1161: felix@1161: felix@1161: /** felix@1161: * Genereate data in csv format. felix@1161: */ felix@1161: @Override felix@1161: public void generate() felix@1161: throws IOException felix@1161: { felix@1161: logger.debug("WDifferencesExporter.generate"); felix@1161: felix@1161: if (facet == null) { felix@1161: throw new IOException("invalid (null) facet for exporter"); felix@1161: } felix@1161: else if (facet.equals(AbstractExporter.FACET_CSV)) { felix@1161: generateCSV(); felix@1161: } raimund@2180: else if (facet.equals(AbstractExporter.FACET_PDF)) { raimund@2180: generatePDF(); raimund@2180: } felix@1161: else { felix@1161: throw new IOException("invalid facet (" + facet + ") for exporter"); felix@1161: } felix@1161: } felix@1161: felix@1161: felix@1161: /** felix@1161: * Adds given data. felix@1161: * @param d either a WKms or a CalculationResult to add to data. felix@1161: */ felix@1161: @Override felix@1161: protected void addData(Object d) { felix@1161: if (d instanceof CalculationResult) { felix@1161: d = ((CalculationResult)d).getData(); felix@1161: if (d instanceof WKms []) { felix@1161: data.add((WKms [])d); felix@1161: } felix@1161: } felix@1161: else if (d instanceof WKms) { felix@1161: data.add(new WKms[] { (WKms) d }); felix@1161: } felix@1161: } felix@1161: felix@1161: felix@1161: /** felix@1161: * Lets writer write all data (including header). felix@1161: * @param writer Writer to write data with. felix@1161: */ felix@1161: @Override felix@1161: protected void writeCSVData(CSVWriter writer) { felix@1161: logger.info("WDifferencesExporter.writeData"); felix@1161: felix@1161: writeCSVHeader(writer); felix@1161: felix@1161: for (WKms[] tmp: data) { felix@1161: for (WKms wkms: tmp) { felix@1161: wKms2CSV(writer, wkms); felix@1161: } felix@1161: } felix@1161: } felix@1161: felix@1161: felix@1161: /** felix@1161: * Lets csvwriter write the header (first line in file). felix@3269: * @param writer Writer to write header with. felix@1161: */ felix@1161: protected void writeCSVHeader(CSVWriter writer) { felix@1161: logger.info("WDifferencesExporter.writeCSVHeader"); felix@1161: felix@1161: writer.writeNext(new String[] { felix@1705: msg(WDIFF_CSV_KM_HEADER, WDIFF_DEFAULT_CSV_KM_HEADER), felix@1705: msg(WDIFF_CSV_W_HEADER, WDIFF_DEFAULT_CSV_W_HEADER) felix@1161: }); felix@1161: } felix@1161: felix@1161: felix@1161: protected void wKms2CSV(CSVWriter writer, WKms wkms) { felix@2260: logger.debug("WDifferencesExporter.wKms2CSV"); felix@1161: felix@1161: NumberFormat kmf = getKmFormatter(); felix@1161: NumberFormat wf = getWFormatter(); felix@1161: int size = wkms.size(); felix@1161: felix@1161: for (int i = 0; i < size; i ++) { felix@1161: felix@1161: writer.writeNext(new String[] { felix@1161: kmf.format(wkms.getKm(i)), felix@1161: wf.format(wkms.getW(i)) felix@1161: }); felix@1161: } felix@1161: } felix@1161: felix@1161: felix@1161: /** felix@1161: * Returns the number formatter for kilometer values. felix@1161: * felix@1161: * @return the number formatter for kilometer values. felix@1161: */ felix@1161: protected NumberFormat getKmFormatter() { felix@1161: return Formatter.getWaterlevelKM(context); felix@1161: } felix@1161: felix@1161: felix@1161: /** felix@1161: * Returns the number formatter for W values. felix@1161: * felix@1161: * @return the number formatter for W values. felix@1161: */ felix@1161: protected NumberFormat getWFormatter() { felix@1161: return Formatter.getWaterlevelW(context); felix@1161: } raimund@2176: raimund@2176: raimund@2176: @Override raimund@2180: protected void writePDF(OutputStream out) { raimund@2180: WKmsJRDataSource source = createJRData(); raimund@2185: raimund@2185: String jasperFile = Resources.getMsg( raimund@2185: context.getMeta(), raimund@2185: JASPER_FILE, raimund@2185: "/jasper/wdifferences_en.jasper"); raimund@2185: String confPath = Config.getConfigDirectory().toString(); raimund@2185: raimund@2180: Map parameters = new HashMap(); raimund@2180: parameters.put("ReportTitle", "Exported Data"); raimund@2180: try { raimund@2180: JasperPrint print = JasperFillManager.fillReport( raimund@2185: confPath + jasperFile, raimund@2180: parameters, raimund@2180: source); raimund@2180: JasperExportManager.exportReportToPdfStream(print, out); raimund@2180: } raimund@2180: catch(JRException je) { raimund@2180: logger.warn("Error generating PDF Report!"); raimund@2180: je.printStackTrace(); raimund@2180: } raimund@2180: } raimund@2180: raimund@2180: protected WKmsJRDataSource createJRData() { raimund@2180: WKmsJRDataSource source = new WKmsJRDataSource(); raimund@2180: raimund@2180: addMetaData(source); raimund@2180: for (WKms[] tmp: data) { raimund@2180: for (WKms wkms: tmp) { raimund@2180: addWKmsData(source, wkms); raimund@2180: } raimund@2180: } raimund@2180: return source; raimund@2180: } raimund@2180: raimund@2180: raimund@2180: protected void addMetaData(WKmsJRDataSource source) { raimund@2180: CallMeta meta = context.getMeta(); raimund@2180: raimund@2180: WINFOArtifact flys = (WINFOArtifact) master; raimund@2180: raimund@2180: source.addMetaData ("river", FLYSUtils.getRivername(flys)); raimund@2180: raimund@2180: Locale locale = Resources.getLocale(meta); raimund@2180: DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); raimund@2180: raimund@2180: source.addMetaData("date", df.format(new Date())); raimund@2180: raimund@2180: String differences = FLYSUtils.getWDifferences(flys, context); raimund@2180: source.addMetaData("differences", differences); raimund@2180: raimund@2180: source.addMetaData("calculation", Resources.getMsg( raimund@2180: locale, raimund@2180: PDF_HEADER_MODE, raimund@2180: "W Differences")); raimund@2180: } raimund@2180: raimund@2180: protected void addWKmsData(WKmsJRDataSource source, WKms wkms) { raimund@2180: NumberFormat kmf = getKmFormatter(); raimund@2180: NumberFormat wf = getWFormatter(); raimund@2180: int size = wkms.size(); raimund@2180: raimund@2180: for (int i = 0; i < size; i ++) { raimund@2180: raimund@2180: source.addData(new String[] { raimund@2180: kmf.format(wkms.getKm(i)), raimund@2180: wf.format(wkms.getW(i)) raimund@2180: }); raimund@2180: } raimund@2180: } raimund@2180: felix@1161: } felix@1161: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :