felix@2264: package de.intevation.flys.exports; felix@2264: felix@2264: import java.io.IOException; felix@2264: import java.io.OutputStream; felix@2264: import java.text.NumberFormat; felix@2264: import java.util.ArrayList; felix@2264: import java.util.List; sascha@2290: felix@2264: import java.util.Map; felix@2264: import java.util.HashMap; felix@2264: import java.util.Date; felix@2264: import java.text.DateFormat; felix@2264: import java.util.Locale; felix@2264: felix@2264: import org.w3c.dom.Document; felix@2264: felix@2264: import org.apache.log4j.Logger; felix@2264: felix@2264: import au.com.bytecode.opencsv.CSVWriter; felix@2264: felix@2264: import net.sf.jasperreports.engine.JasperExportManager; felix@2264: import net.sf.jasperreports.engine.JasperFillManager; felix@2264: import net.sf.jasperreports.engine.JasperPrint; felix@2264: import net.sf.jasperreports.engine.JRException; felix@2264: import de.intevation.artifacts.CallContext; felix@2264: import de.intevation.artifacts.CallMeta; felix@2264: import de.intevation.artifacts.common.utils.Config; felix@2264: felix@2272: import de.intevation.flys.artifacts.FLYSArtifact; felix@2264: import de.intevation.flys.artifacts.WINFOArtifact; felix@2264: felix@2264: import de.intevation.flys.artifacts.model.CalculationResult; felix@2285: import de.intevation.flys.artifacts.model.WWQQ; raimund@2310: import de.intevation.flys.artifacts.model.WWQQJRDataSource; felix@2264: import de.intevation.flys.artifacts.resources.Resources; felix@2264: felix@2264: import de.intevation.flys.utils.FLYSUtils; felix@2264: felix@2264: /** felix@2264: * (CSV)Exporter for Reference Curves. felix@2264: */ felix@2264: public class ReferenceCurveExporter extends AbstractExporter { felix@2264: felix@2264: /** The logger used in this exporter. */ felix@2264: private static Logger logger = Logger.getLogger(ReferenceCurveExporter.class); felix@2264: felix@2264: felix@2264: public static final String RC_CSV_KM_HEADER = felix@2264: "export.reference_curve.csv.header.km"; felix@2264: felix@2329: public static final String RC_CSV_W_CM_HEADER = felix@2329: "export.reference_curve.csv.header.w.cm"; felix@2329: felix@2329: public static final String RC_CSV_W_M_HEADER = felix@2329: "export.reference_curve.csv.header.w.m"; felix@2264: felix@2270: public static final String RC_CSV_Q_HEADER = felix@2270: "export.reference_curve.csv.header.q"; felix@2270: felix@2272: public static final String CSV_LOCATION_HEADER = felix@2272: "export.waterlevel.csv.header.location"; felix@2272: felix@2272: public static final String DEFAULT_CSV_LOCATION_HEADER = "Lage"; felix@2272: felix@2264: public static final String RC_DEFAULT_CSV_KM_HEADER = "Fluss-Km"; felix@2329: public static final String RC_DEFAULT_CSV_W_M_HEADER = "m"; felix@2329: public static final String RC_DEFAULT_CSV_W_CM_HEADER = "cm"; felix@2270: public static final String RC_DEFAULT_CSV_Q_HEADER = "Q"; felix@2264: felix@2264: public static final String PDF_HEADER_MODE = "export.reference_curve.pdf.mode"; felix@2264: public static final String JASPER_FILE = "export.reference_curve.pdf.file"; felix@2264: felix@2264: /** The storage that contains all WKms objects for the different facets. */ felix@2285: protected List data; felix@2264: felix@2264: felix@2264: public void init(Document request, OutputStream out, CallContext context) { felix@2264: logger.debug("ReferenceCurveExporter.init"); felix@2264: felix@2264: super.init(request, out, context); felix@2264: felix@2285: this.data = new ArrayList(); felix@2264: } felix@2264: felix@2264: felix@2264: /** felix@2264: * Genereate data in csv format. felix@2264: */ felix@2264: @Override felix@2264: public void generate() felix@2264: throws IOException felix@2264: { felix@2264: logger.debug("ReferenceCurveExporter.generate"); felix@2264: felix@2264: if (facet == null) { felix@2264: throw new IOException("invalid (null) facet for exporter"); felix@2264: } felix@2264: else if (facet.equals(AbstractExporter.FACET_CSV)) { felix@2264: generateCSV(); felix@2264: } felix@2264: else if (facet.equals(AbstractExporter.FACET_PDF)) { felix@2264: generatePDF(); felix@2264: } felix@2264: else { felix@2264: throw new IOException("invalid facet (" + facet + ") for exporter"); felix@2264: } felix@2264: } felix@2264: felix@2264: felix@2264: /** felix@2264: * Adds given data. felix@2285: * @param d a WWQQ[]. felix@2264: */ felix@2264: @Override felix@2264: protected void addData(Object d) { felix@2285: logger.debug("ReferenceCurveExporter.addData"); felix@2285: felix@2264: if (d instanceof CalculationResult) { felix@2264: d = ((CalculationResult)d).getData(); felix@2285: if (d instanceof WWQQ []) { felix@2285: data.add((WWQQ [])d); felix@2285: logger.debug("ReferenceCurveExporter.addData wwqq[]."); felix@2285: } felix@2285: else { felix@2285: logger.warn("ReferenceCurveExporter.addData/1 unknown type (" felix@2285: + d + ")."); felix@2264: } felix@2264: } felix@2264: else { felix@2285: logger.warn("ReferenceCurveExporter.addData/2 unknown type (" felix@2285: + d + ")."); felix@2264: } felix@2264: } felix@2264: felix@2264: felix@2264: /** felix@2264: * Lets writer write all data (including header). felix@2264: * @param writer Writer to write data with. felix@2264: */ felix@2264: @Override felix@2264: protected void writeCSVData(CSVWriter writer) { felix@2264: logger.info("ReferenceCurveExporter.writeData"); felix@2264: felix@2264: writeCSVHeader(writer); felix@2264: felix@2285: for (WWQQ[] tmp: data) { felix@2285: for (WWQQ ww: tmp) { felix@2285: wWQQ2CSV(writer, ww); felix@2264: } felix@2264: } felix@2264: } felix@2264: felix@2264: felix@2264: /** felix@2264: * Lets csvwriter write the header (first line in file). felix@2264: * @param write Writer to write header with. felix@2264: */ felix@2264: protected void writeCSVHeader(CSVWriter writer) { felix@2264: logger.info("ReferenceCurveExporter.writeCSVHeader"); felix@2264: felix@2285: // TODO missing 'relative' W(cm). felix@2264: writer.writeNext(new String[] { felix@2264: msg(RC_CSV_KM_HEADER, RC_DEFAULT_CSV_KM_HEADER), felix@2272: msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER), felix@2329: msg(RC_CSV_W_M_HEADER, RC_DEFAULT_CSV_W_M_HEADER), felix@2329: msg(RC_CSV_W_CM_HEADER, RC_DEFAULT_CSV_W_CM_HEADER), felix@2270: msg(RC_CSV_Q_HEADER, RC_DEFAULT_CSV_Q_HEADER), felix@2270: msg(RC_CSV_KM_HEADER, RC_DEFAULT_CSV_KM_HEADER), felix@2272: msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER), felix@2329: msg(RC_CSV_W_M_HEADER, RC_DEFAULT_CSV_W_M_HEADER), felix@2329: msg(RC_CSV_W_CM_HEADER, RC_DEFAULT_CSV_W_CM_HEADER), felix@2270: msg(RC_CSV_Q_HEADER, RC_DEFAULT_CSV_Q_HEADER), felix@2264: }); felix@2264: } felix@2264: felix@2264: felix@2285: protected void wWQQ2CSV(CSVWriter writer, WWQQ ww) { felix@2285: logger.debug("ReferenceCurveExporter.wWQQ2CSV"); felix@2264: felix@2285: NumberFormat kmf = getKmFormatter(); felix@2285: NumberFormat wf = getWFormatter(); felix@2285: NumberFormat qf = getQFormatter(); felix@2285: felix@2264: int size = ww.size(); felix@2264: felix@2272: FLYSArtifact flys = (FLYSArtifact) master; felix@2272: felix@2272: String startLocationDescription = FLYSUtils.getLocationDescription( felix@2272: flys, ww.getStartKm()); felix@2272: felix@2272: String endLocationDescription = FLYSUtils.getLocationDescription( felix@2272: flys, ww.getEndKm()); felix@2272: felix@2285: // TODO missing 'relative' W(cm). felix@2264: for (int i = 0; i < size; i ++) { felix@2264: writer.writeNext(new String[] { felix@2264: kmf.format(ww.getStartKm()), felix@2272: startLocationDescription, felix@2270: wf.format(ww.getW1(i)), felix@2329: wf.format(ww.getRelHeight1Cm(i)), felix@2285: qf.format(ww.getQ1(i)), // "Q" felix@2270: kmf.format(ww.getEndKm()), felix@2272: endLocationDescription, felix@2270: wf.format(ww.getW2(i)), felix@2329: wf.format(ww.getRelHeight2Cm(i)), felix@2285: qf.format(ww.getQ2(i)) // "Q" felix@2264: }); felix@2264: } felix@2264: } felix@2264: felix@2264: felix@2264: @Override felix@2264: protected void writePDF(OutputStream out) { raimund@2310: WWQQJRDataSource source = createJRData(); felix@2264: felix@2264: String jasperFile = Resources.getMsg( felix@2264: context.getMeta(), felix@2264: JASPER_FILE, raimund@2310: "/jasper/reference_en.jasper"); felix@2264: String confPath = Config.getConfigDirectory().toString(); felix@2264: felix@2264: Map parameters = new HashMap(); felix@2264: parameters.put("ReportTitle", "Exported Data"); felix@2264: try { felix@2264: JasperPrint print = JasperFillManager.fillReport( felix@2264: confPath + jasperFile, felix@2264: parameters, felix@2264: source); felix@2264: JasperExportManager.exportReportToPdfStream(print, out); felix@2264: } felix@2264: catch(JRException je) { felix@2264: logger.warn("Error generating PDF Report!"); felix@2264: je.printStackTrace(); felix@2264: } felix@2264: } felix@2264: raimund@2310: protected WWQQJRDataSource createJRData() { raimund@2310: WWQQJRDataSource source = new WWQQJRDataSource(); felix@2264: felix@2264: addMetaData(source); raimund@2310: raimund@2310: for (WWQQ[] tmp: data) { raimund@2310: for (WWQQ ww: tmp) { raimund@2310: addWWQQData(source, ww); felix@2264: } felix@2264: } felix@2264: return source; felix@2264: } felix@2264: felix@2264: raimund@2310: protected void addMetaData(WWQQJRDataSource source) { felix@2264: CallMeta meta = context.getMeta(); felix@2264: felix@2264: WINFOArtifact flys = (WINFOArtifact) master; felix@2264: felix@2264: source.addMetaData ("river", FLYSUtils.getRivername(flys)); felix@2264: felix@2264: Locale locale = Resources.getLocale(meta); felix@2264: DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); felix@2264: felix@2264: source.addMetaData("date", df.format(new Date())); felix@2264: felix@2264: source.addMetaData("calculation", Resources.getMsg( felix@2264: locale, felix@2264: PDF_HEADER_MODE, raimund@2310: "Reference Curve")); felix@2264: } felix@2264: felix@2264: raimund@2310: protected void addWWQQData(WWQQJRDataSource source, WWQQ ww) { raimund@2310: NumberFormat kmf = getKmFormatter(); raimund@2310: NumberFormat wf = getWFormatter(); raimund@2310: NumberFormat qf = getQFormatter(); felix@2264: raimund@2310: int size = ww.size(); raimund@2310: raimund@2310: FLYSArtifact flys = (FLYSArtifact) master; raimund@2310: raimund@2310: String startLocationDescription = FLYSUtils.getLocationDescription( raimund@2310: flys, ww.getStartKm()); raimund@2310: raimund@2310: String endLocationDescription = FLYSUtils.getLocationDescription( raimund@2310: flys, ww.getEndKm()); raimund@2310: raimund@2310: // TODO missing 'relative' W(cm). raimund@2310: for (int i = 0; i < size; i ++) { felix@2264: source.addData(new String[] { raimund@2310: kmf.format(ww.getStartKm()), raimund@2310: startLocationDescription, raimund@2310: wf.format(ww.getW1(i)), raimund@2310: qf.format(ww.getQ1(i)), // "Q" raimund@2310: kmf.format(ww.getEndKm()), raimund@2310: endLocationDescription, raimund@2310: wf.format(ww.getW2(i)), raimund@2310: qf.format(ww.getQ2(i)) // "Q" felix@2264: }); felix@2264: } felix@2264: } felix@2264: } felix@2264: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :