Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/exports/ReferenceCurveExporter.java @ 5838:5aa05a7a34b7
Rename modules to more fitting names.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 15:23:37 +0200 |
parents | flys-artifacts/src/main/java/org/dive4elements/river/exports/ReferenceCurveExporter.java@bd047b71ab37 |
children | 4897a58c8746 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/ReferenceCurveExporter.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,370 @@ +package org.dive4elements.river.exports; + +import au.com.bytecode.opencsv.CSVWriter; + +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.artifacts.CallMeta; + +import org.dive4elements.artifacts.common.utils.Config; + +import org.dive4elements.river.artifacts.FLYSArtifact; +import org.dive4elements.river.artifacts.WINFOArtifact; + +import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.model.WWQQ; +import org.dive4elements.river.artifacts.model.WWQQJRDataSource; + +import org.dive4elements.river.artifacts.resources.Resources; + +import org.dive4elements.river.utils.FLYSUtils; + +import java.io.IOException; +import java.io.OutputStream; + +import java.text.DateFormat; +import java.text.NumberFormat; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperExportManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; + +/** + * (CSV)Exporter for Reference Curves. + */ +public class ReferenceCurveExporter extends AbstractExporter { + + /** The logger used in this exporter. */ + private static Logger logger = Logger.getLogger(ReferenceCurveExporter.class); + + public static final String RC_CSV_KM_HEADER = + "export.reference_curve.csv.header.km"; + + public static final String RC_CSV_W_CM_HEADER = + "export.reference_curve.csv.header.w.cm"; + + public static final String RC_CSV_W_M_HEADER = + "export.reference_curve.csv.header.w.m"; + + public static final String RC_CSV_Q_HEADER = + "export.reference_curve.csv.header.w.q"; + + public static final String CSV_LOCATION_HEADER = + "export.waterlevel.csv.header.location"; + + public static final String DEFAULT_CSV_LOCATION_HEADER = "Lage"; + + public static final String RC_DEFAULT_CSV_KM_HEADER = "Fluss-Km"; + public static final String RC_DEFAULT_CSV_W_M_HEADER = "W (m + NHN)"; + public static final String RC_DEFAULT_CSV_W_CM_HEADER = "W (cm am Pegel)"; + public static final String RC_DEFAULT_CSV_Q_HEADER = "gleichw. Q (m\u00b3/s)"; + + public static final String PDF_HEADER_MODE = "export.reference_curve.pdf.mode"; + public static final String JASPER_FILE = "export.reference_curve.pdf.file"; + public static final String JASPER_FILE_GAUGE = "export.reference_curve.pdf.file.gauge"; + public static final String JASPER_FILE_GAUGE_END = "export.reference_curve.pdf.file.gauge.end"; + public static final String JASPER_FILE_GAUGE_START_END = "export.reference_curve.pdf.file.gauge.start.end"; + + /** The storage that contains all WKms objects for the different facets. */ + protected List<WWQQ[]> data; + + protected boolean startAtGauge = false; + + protected boolean endAtGauge = false; + + + @Override + public void init(Document request, OutputStream out, CallContext context) { + logger.debug("ReferenceCurveExporter.init"); + + super.init(request, out, context); + + this.data = new ArrayList<WWQQ[]>(); + } + + + /** + * Genereate data in csv format. + */ + @Override + public void generate() + throws IOException + { + logger.debug("ReferenceCurveExporter.generate"); + + if (facet == null) { + throw new IOException("invalid (null) facet for exporter"); + } + else if (facet.equals(AbstractExporter.FACET_CSV)) { + generateCSV(); + } + else if (facet.equals(AbstractExporter.FACET_PDF)) { + generatePDF(); + } + else { + throw new IOException("invalid facet (" + facet + ") for exporter"); + } + } + + + /** + * Adds given data. + * @param d A CalculationResult with WWQQ[]. + */ + @Override + protected void addData(Object d) { + logger.debug("ReferenceCurveExporter.addData"); + + if (d instanceof CalculationResult) { + d = ((CalculationResult)d).getData(); + if (d instanceof WWQQ []) { + WWQQ[] wwqqs = (WWQQ []) d; + for (WWQQ wwqq: wwqqs) { + if (wwqq.startAtGauge()) { + startAtGauge = true; + } + // TODO this one probably has to be inverted. + if (wwqq.endAtGauge()) { + endAtGauge = true; + } + } + data.add(wwqqs); + logger.debug("ReferenceCurveExporter.addData wwqq[]."); + } + else { + logger.warn("ReferenceCurveExporter.addData/1 unknown type (" + + d + ")."); + } + } + else { + logger.warn("ReferenceCurveExporter.addData/2 unknown type (" + + d + ")."); + } + } + + + /** + * Lets writer write all data (including header). + * @param writer Writer to write data with. + */ + @Override + protected void writeCSVData(CSVWriter writer) { + logger.debug("ReferenceCurveExporter.writeData"); + + writeCSVHeader(writer); + + for (WWQQ[] tmp: data) { + for (WWQQ ww: tmp) { + wWQQ2CSV(writer, ww); + } + } + } + + + /** + * Lets csvwriter write the header (first line in file). + * @param writer Writer to write header with. + */ + protected void writeCSVHeader(CSVWriter writer) { + logger.info("ReferenceCurveExporter.writeCSVHeader"); + + StepCSVWriter stepWriter = new StepCSVWriter(); + stepWriter.setCSVWriter(writer); + + stepWriter.addNexts( + msg(RC_CSV_KM_HEADER, RC_DEFAULT_CSV_KM_HEADER), + msg(RC_CSV_W_M_HEADER, RC_DEFAULT_CSV_W_M_HEADER) + ); + if (startAtGauge) { + stepWriter.addNext( + msg(RC_CSV_W_CM_HEADER, RC_DEFAULT_CSV_W_CM_HEADER)); + } + stepWriter.addNexts( + msg(RC_CSV_Q_HEADER, RC_DEFAULT_CSV_Q_HEADER), + msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER), + msg(RC_CSV_KM_HEADER, RC_DEFAULT_CSV_KM_HEADER), + msg(RC_CSV_W_M_HEADER, RC_DEFAULT_CSV_W_M_HEADER) + ); + if (endAtGauge) { + stepWriter.addNext( + msg(RC_CSV_W_CM_HEADER, RC_DEFAULT_CSV_W_CM_HEADER) + ); + } + stepWriter.addNexts( + msg(RC_CSV_Q_HEADER, RC_DEFAULT_CSV_Q_HEADER), + msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER) + ); + + stepWriter.flush(); + } + + + protected void wWQQ2CSV(CSVWriter writer, WWQQ ww) { + logger.debug("ReferenceCurveExporter.wWQQ2CSV"); + + NumberFormat kmf = getKmFormatter(); + NumberFormat wf = getWFormatter(); + NumberFormat qf = getQFormatter(); + + int size = ww.size(); + + FLYSArtifact flys = (FLYSArtifact) master; + + StepCSVWriter stepWriter = new StepCSVWriter(); + stepWriter.setCSVWriter(writer); + + String startLocationDescription = FLYSUtils.getLocationDescription( + flys, ww.getStartKm()); + + String endLocationDescription = FLYSUtils.getLocationDescription( + flys, ww.getEndKm()); + + for (int i = 0; i < size; i ++) { + stepWriter.addNexts(kmf.format(ww.getStartKm())); + stepWriter.addNext(wf.format(ww.getW1(i))); + if (startAtGauge) { + stepWriter.addNext(wf.format(ww.getRelHeight1Cm(i))); + } + stepWriter.addNexts( + qf.format(ww.getQ1(i)), // "Q" + startLocationDescription, + kmf.format(ww.getEndKm()) + ); + stepWriter.addNext(wf.format(ww.getW2(i))); + if (endAtGauge) { + if (ww.endAtGauge()) { + stepWriter.addNext(wf.format(ww.getRelHeight2Cm(i))); + } + else { + stepWriter.addNext("-"); + } + } + stepWriter.addNexts( + qf.format(ww.getQ2(i)), // "Q" + endLocationDescription + ); + stepWriter.flush(); + } + } + + + @Override + protected void writePDF(OutputStream out) { + WWQQJRDataSource source = createJRData(); + + String filename = JASPER_FILE; + if (startAtGauge && endAtGauge) { + filename = JASPER_FILE_GAUGE_START_END; + } + else if (startAtGauge) { + filename = JASPER_FILE_GAUGE; + } + else if (endAtGauge) { + filename = JASPER_FILE_GAUGE_END; + } + + String jasperFile = Resources.getMsg( + context.getMeta(), + filename, + "/jasper/reference_en.jasper"); + String confPath = Config.getConfigDirectory().toString(); + + Map parameters = new HashMap(); + parameters.put("ReportTitle", "Exported Data"); + try { + JasperPrint print = JasperFillManager.fillReport( + confPath + jasperFile, + parameters, + source); + JasperExportManager.exportReportToPdfStream(print, out); + } + catch(JRException je) { + logger.warn("Error generating PDF Report!"); + je.printStackTrace(); + } + } + + protected WWQQJRDataSource createJRData() { + WWQQJRDataSource source = new WWQQJRDataSource(); + + addMetaData(source); + + for (WWQQ[] tmp: data) { + for (WWQQ ww: tmp) { + addWWQQData(source, ww); + } + } + return source; + } + + + protected void addMetaData(WWQQJRDataSource source) { + CallMeta meta = context.getMeta(); + + WINFOArtifact flys = (WINFOArtifact) master; + + source.addMetaData ("river", FLYSUtils.getRivername(flys)); + + Locale locale = Resources.getLocale(meta); + DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); + + source.addMetaData("date", df.format(new Date())); + + source.addMetaData("calculation", Resources.getMsg( + locale, + PDF_HEADER_MODE, + "Reference Curve")); + } + + + protected void addWWQQData(WWQQJRDataSource source, WWQQ ww) { + NumberFormat kmf = getKmFormatter(); + NumberFormat wf = getWFormatter(); + NumberFormat qf = getQFormatter(); + + int size = ww.size(); + + FLYSArtifact flys = (FLYSArtifact) master; + + String startLocationDescription = FLYSUtils.getLocationDescription( + flys, ww.getStartKm()); + + String endLocationDescription = FLYSUtils.getLocationDescription( + flys, ww.getEndKm()); + + for (int i = 0; i < size; i ++) { + String start = "-"; + String end = "-"; + if (startAtGauge) { + start = wf.format(ww.getRelHeight1Cm(i)); + } + if (ww.endAtGauge()) { + end = wf.format(ww.getRelHeight2Cm(i)); + } + source.addData(new String[] { + kmf.format(ww.getStartKm()), + startLocationDescription, + wf.format(ww.getW1(i)), + qf.format(ww.getQ1(i)), // "Q" + kmf.format(ww.getEndKm()), + endLocationDescription, + wf.format(ww.getW2(i)), + qf.format(ww.getQ2(i)), // "Q" + start, + end + }); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :