teichmann@5831: package org.dive4elements.river.exports; felix@2264: felix@2264: import au.com.bytecode.opencsv.CSVWriter; felix@2264: teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.CallMeta; felix@2264: teichmann@5831: import org.dive4elements.artifacts.common.utils.Config; felix@2264: teichmann@5831: import org.dive4elements.river.artifacts.FLYSArtifact; teichmann@5831: import org.dive4elements.river.artifacts.WINFOArtifact; sascha@2787: teichmann@5831: import org.dive4elements.river.artifacts.model.CalculationResult; teichmann@5831: import org.dive4elements.river.artifacts.model.WWQQ; teichmann@5831: import org.dive4elements.river.artifacts.model.WWQQJRDataSource; felix@2264: teichmann@5831: import org.dive4elements.river.artifacts.resources.Resources; teichmann@5831: teichmann@5831: import org.dive4elements.river.utils.FLYSUtils; felix@2264: sascha@2787: import java.io.IOException; sascha@2787: import java.io.OutputStream; sascha@2787: sascha@2787: import java.text.DateFormat; sascha@2787: import java.text.NumberFormat; sascha@2787: sascha@2787: import java.util.ArrayList; sascha@2787: import java.util.Date; sascha@2787: import java.util.HashMap; sascha@2787: import java.util.List; sascha@2787: import java.util.Locale; sascha@2787: import java.util.Map; sascha@2787: sascha@2787: import net.sf.jasperreports.engine.JRException; sascha@2787: import net.sf.jasperreports.engine.JasperExportManager; sascha@2787: import net.sf.jasperreports.engine.JasperFillManager; sascha@2787: import net.sf.jasperreports.engine.JasperPrint; sascha@2787: sascha@2787: import org.apache.log4j.Logger; sascha@2787: sascha@2787: import org.w3c.dom.Document; felix@2576: 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: 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 = raimund@2631: "export.reference_curve.csv.header.w.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@2566: public static final String RC_DEFAULT_CSV_W_M_HEADER = "W (m + NHN)"; felix@2566: public static final String RC_DEFAULT_CSV_W_CM_HEADER = "W (cm am Pegel)"; raimund@2631: public static final String RC_DEFAULT_CSV_Q_HEADER = "gleichw. Q (m\u00b3/s)"; 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"; raimund@2631: public static final String JASPER_FILE_GAUGE = "export.reference_curve.pdf.file.gauge"; raimund@2631: public static final String JASPER_FILE_GAUGE_END = "export.reference_curve.pdf.file.gauge.end"; raimund@2631: public static final String JASPER_FILE_GAUGE_START_END = "export.reference_curve.pdf.file.gauge.start.end"; felix@2264: felix@2264: /** The storage that contains all WKms objects for the different facets. */ felix@2285: protected List data; felix@2264: felix@2576: protected boolean startAtGauge = false; felix@2264: felix@2576: protected boolean endAtGauge = false; felix@2576: sascha@3076: sascha@2787: @Override 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@2576: * @param d A CalculationResult with 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@2576: WWQQ[] wwqqs = (WWQQ []) d; felix@2576: for (WWQQ wwqq: wwqqs) { felix@2576: if (wwqq.startAtGauge()) { felix@2576: startAtGauge = true; felix@2576: } felix@2576: // TODO this one probably has to be inverted. felix@2576: if (wwqq.endAtGauge()) { felix@2576: endAtGauge = true; felix@2576: } felix@2576: } felix@2576: data.add(wwqqs); 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) { sascha@2787: logger.debug("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@3270: * @param writer Writer to write header with. felix@2264: */ felix@2264: protected void writeCSVHeader(CSVWriter writer) { felix@2264: logger.info("ReferenceCurveExporter.writeCSVHeader"); felix@2264: felix@2578: StepCSVWriter stepWriter = new StepCSVWriter(); felix@2578: stepWriter.setCSVWriter(writer); felix@2576: felix@2578: stepWriter.addNexts( felix@2270: msg(RC_CSV_KM_HEADER, RC_DEFAULT_CSV_KM_HEADER), felix@2578: msg(RC_CSV_W_M_HEADER, RC_DEFAULT_CSV_W_M_HEADER) felix@2578: ); felix@2578: if (startAtGauge) { felix@2578: stepWriter.addNext( felix@2578: msg(RC_CSV_W_CM_HEADER, RC_DEFAULT_CSV_W_CM_HEADER)); felix@2578: } felix@2578: stepWriter.addNexts( felix@2578: msg(RC_CSV_Q_HEADER, RC_DEFAULT_CSV_Q_HEADER), felix@2272: msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER), felix@2578: msg(RC_CSV_KM_HEADER, RC_DEFAULT_CSV_KM_HEADER), felix@2576: msg(RC_CSV_W_M_HEADER, RC_DEFAULT_CSV_W_M_HEADER) felix@2578: ); felix@2576: if (endAtGauge) { felix@2578: stepWriter.addNext( felix@2578: msg(RC_CSV_W_CM_HEADER, RC_DEFAULT_CSV_W_CM_HEADER) felix@2578: ); felix@2576: } felix@2578: stepWriter.addNexts( felix@2578: msg(RC_CSV_Q_HEADER, RC_DEFAULT_CSV_Q_HEADER), felix@2578: msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER) felix@2578: ); felix@2576: felix@2578: stepWriter.flush(); 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@2576: int size = ww.size(); felix@2264: felix@2272: FLYSArtifact flys = (FLYSArtifact) master; felix@2272: felix@2576: StepCSVWriter stepWriter = new StepCSVWriter(); felix@2576: stepWriter.setCSVWriter(writer); felix@2576: 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@2264: for (int i = 0; i < size; i ++) { felix@2578: stepWriter.addNexts(kmf.format(ww.getStartKm())); felix@2577: stepWriter.addNext(wf.format(ww.getW1(i))); felix@2576: if (startAtGauge) { felix@2576: stepWriter.addNext(wf.format(ww.getRelHeight1Cm(i))); felix@2576: } felix@2576: stepWriter.addNexts( felix@2285: qf.format(ww.getQ1(i)), // "Q" felix@2578: startLocationDescription, felix@2578: kmf.format(ww.getEndKm()) felix@2578: ); felix@2577: stepWriter.addNext(wf.format(ww.getW2(i))); felix@2576: if (endAtGauge) { felix@2577: if (ww.endAtGauge()) { felix@2577: stepWriter.addNext(wf.format(ww.getRelHeight2Cm(i))); felix@2577: } felix@2577: else { felix@2577: stepWriter.addNext("-"); felix@2577: } felix@2576: } felix@2578: stepWriter.addNexts( felix@2578: qf.format(ww.getQ2(i)), // "Q" felix@2578: endLocationDescription felix@2576: ); felix@2576: stepWriter.flush(); 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: raimund@2631: String filename = JASPER_FILE; raimund@2631: if (startAtGauge && endAtGauge) { raimund@2631: filename = JASPER_FILE_GAUGE_START_END; raimund@2631: } raimund@2631: else if (startAtGauge) { raimund@2631: filename = JASPER_FILE_GAUGE; raimund@2631: } raimund@2631: else if (endAtGauge) { raimund@2631: filename = JASPER_FILE_GAUGE_END; raimund@2631: } raimund@2631: felix@2264: String jasperFile = Resources.getMsg( felix@2264: context.getMeta(), raimund@2631: filename, 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: felix@2576: 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: for (int i = 0; i < size; i ++) { raimund@2631: String start = "-"; raimund@2631: String end = "-"; raimund@2631: if (startAtGauge) { raimund@2631: start = wf.format(ww.getRelHeight1Cm(i)); raimund@2631: } raimund@2631: if (ww.endAtGauge()) { raimund@2631: end = wf.format(ww.getRelHeight2Cm(i)); raimund@2631: } 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@2631: qf.format(ww.getQ2(i)), // "Q" raimund@2631: start, raimund@2631: end felix@2264: }); felix@2264: } felix@2264: } felix@2264: } felix@2264: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :