comparison flys-artifacts/src/main/java/de/intevation/flys/exports/WaterlevelExporter.java @ 2176:65dac9cf6ff5

Issue 138. PDF output for waterlevel calculation result. flys-artifacts/trunk@3774 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Thu, 26 Jan 2012 15:38:46 +0000
parents a4bdf7d8527e
children 5ff481ab24a1
comparison
equal deleted inserted replaced
2175:3f90f4d37c8d 2176:65dac9cf6ff5
3 import java.io.IOException; 3 import java.io.IOException;
4 import java.io.OutputStream; 4 import java.io.OutputStream;
5 import java.text.DateFormat; 5 import java.text.DateFormat;
6 import java.text.NumberFormat; 6 import java.text.NumberFormat;
7 import java.util.ArrayList; 7 import java.util.ArrayList;
8 import java.util.Map;
9 import java.util.HashMap;
8 import java.util.Date; 10 import java.util.Date;
9 import java.util.List; 11 import java.util.List;
10 import java.util.Locale; 12 import java.util.Locale;
11 import java.util.regex.Matcher; 13 import java.util.regex.Matcher;
12 import java.util.regex.Pattern; 14 import java.util.regex.Pattern;
15 17
16 import org.apache.log4j.Logger; 18 import org.apache.log4j.Logger;
17 19
18 import au.com.bytecode.opencsv.CSVWriter; 20 import au.com.bytecode.opencsv.CSVWriter;
19 21
22 import net.sf.jasperreports.engine.JRDataSource;
23 import net.sf.jasperreports.engine.JasperExportManager;
24 import net.sf.jasperreports.engine.JasperFillManager;
25 import net.sf.jasperreports.engine.JasperPrint;
26 import net.sf.jasperreports.engine.JRException;
27
20 import de.intevation.artifacts.CallContext; 28 import de.intevation.artifacts.CallContext;
21 import de.intevation.artifacts.CallMeta; 29 import de.intevation.artifacts.CallMeta;
22 30
23 import de.intevation.flys.model.Gauge; 31 import de.intevation.flys.model.Gauge;
24 32
25 import de.intevation.flys.artifacts.FLYSArtifact; 33 import de.intevation.flys.artifacts.FLYSArtifact;
26 import de.intevation.flys.artifacts.WINFOArtifact; 34 import de.intevation.flys.artifacts.WINFOArtifact;
27 import de.intevation.flys.artifacts.model.CalculationResult; 35 import de.intevation.flys.artifacts.model.CalculationResult;
28 import de.intevation.flys.artifacts.model.WQCKms; 36 import de.intevation.flys.artifacts.model.WQCKms;
29 import de.intevation.flys.artifacts.model.WQKms; 37 import de.intevation.flys.artifacts.model.WQKms;
38 import de.intevation.flys.artifacts.model.WKmsJRDataSource;
30 import de.intevation.flys.artifacts.resources.Resources; 39 import de.intevation.flys.artifacts.resources.Resources;
31 40
32 import de.intevation.flys.utils.FLYSUtils; 41 import de.intevation.flys.utils.FLYSUtils;
33 import de.intevation.flys.utils.FLYSUtils.WQ_MODE; 42 import de.intevation.flys.utils.FLYSUtils.WQ_MODE;
34 import de.intevation.flys.utils.Formatter; 43 import de.intevation.flys.utils.Formatter;
106 public static final String DEFAULT_CSV_LOCATION_HEADER = "Lage"; 115 public static final String DEFAULT_CSV_LOCATION_HEADER = "Lage";
107 public static final String DEFAULT_CSV_GAUGE_HEADER = "Bezugspegel"; 116 public static final String DEFAULT_CSV_GAUGE_HEADER = "Bezugspegel";
108 public static final String DEFAULT_CSV_NOT_IN_GAUGE_RANGE = 117 public static final String DEFAULT_CSV_NOT_IN_GAUGE_RANGE =
109 "außerhalb des gewählten Bezugspegels"; 118 "außerhalb des gewählten Bezugspegels";
110 119
120 public static final String PDF_HEADER_MODE = "export.waterlevel.pdf.mode";
111 121
112 /** The storage that contains all WQKms objects for the different facets.*/ 122 /** The storage that contains all WQKms objects for the different facets.*/
113 protected List<WQKms[]> data; 123 protected List<WQKms[]> data;
114 124
115 125
131 if (facet != null && facet.equals(AbstractExporter.FACET_CSV)) { 141 if (facet != null && facet.equals(AbstractExporter.FACET_CSV)) {
132 generateCSV(); 142 generateCSV();
133 } 143 }
134 else if (facet != null && facet.equals(FACET_WST)) { 144 else if (facet != null && facet.equals(FACET_WST)) {
135 generateWST(); 145 generateWST();
146 }
147 else if (facet != null && facet.equals(AbstractExporter.FACET_PDF)) {
148 generatePDF();
136 } 149 }
137 else { 150 else {
138 throw new IOException("invalid facet for exporter"); 151 throw new IOException("invalid facet for exporter");
139 } 152 }
140 } 153 }
568 * @return the number formatter for Q values. 581 * @return the number formatter for Q values.
569 */ 582 */
570 protected NumberFormat getQFormatter() { 583 protected NumberFormat getQFormatter() {
571 return Formatter.getWaterlevelQ(context); 584 return Formatter.getWaterlevelQ(context);
572 } 585 }
586
587
588 /**
589 *
590 */
591 @Override
592 protected void writePDF(OutputStream out) {
593 logger.debug("write PDF");
594 WKmsJRDataSource source = createJRData();
595 Map parameters = new HashMap();
596 parameters.put("ReportTitle", "Exported Data");
597 try {
598 JasperPrint print = JasperFillManager.fillReport(
599 "conf/jasper/waterlevel.jasper",
600 parameters,
601 source);
602 JasperExportManager.exportReportToPdfStream(print, out);
603 }
604 catch(JRException je) {
605 logger.warn("Error generating PDF Report!");
606 je.printStackTrace();
607 }
608 }
609
610 protected WKmsJRDataSource createJRData() {
611 WKmsJRDataSource source = new WKmsJRDataSource();
612
613 WQ_MODE mode = FLYSUtils.getWQMode((FLYSArtifact)master);
614 boolean atGauge = mode == WQ_MODE.QGAUGE || mode == WQ_MODE.WGAUGE;
615 boolean isQ = mode == WQ_MODE.QGAUGE || mode == WQ_MODE.QFREE;
616
617 addMetaData(source);
618 for (WQKms[] tmp: data) {
619 for (WQKms wqkms: tmp) {
620 addWKmsData(wqkms, atGauge, isQ, source);
621 }
622 }
623 return source;
624 }
625
626 protected void addMetaData(WKmsJRDataSource source) {
627 CallMeta meta = context.getMeta();
628
629 FLYSArtifact flys = (FLYSArtifact) master;
630
631 source.addMetaData ("river", FLYSUtils.getRivername(flys));
632
633 Locale locale = Resources.getLocale(meta);
634 DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
635
636 source.addMetaData("date", df.format(new Date()));
637
638 double[] kms = FLYSUtils.getKmRange(flys);
639 source.addMetaData("range", kms[0] + " - " + kms[kms.length-1]);
640
641 source.addMetaData("gauge", FLYSUtils.getGaugename(flys));
642
643 source.addMetaData("calculation", Resources.getMsg(
644 locale,
645 PDF_HEADER_MODE,
646 "Waterlevel"));
647 }
648
649 protected void addWKmsData(
650 WQKms wqkms,
651 boolean atGauge,
652 boolean isQ,
653 WKmsJRDataSource source)
654 {
655 logger.debug("WaterlevelExporter.addWKmsData");
656
657 NumberFormat kmf = getKmFormatter();
658 NumberFormat wf = getWFormatter();
659 NumberFormat qf = getQFormatter();
660
661 int size = wqkms.size();
662 double[] result = new double[3];
663
664 FLYSArtifact flys = (FLYSArtifact) master;
665 Gauge gauge = FLYSUtils.getGauge(flys);
666 String gaugeName = gauge.getName();
667 String desc = "";
668 String notinrange = msg(
669 CSV_NOT_IN_GAUGE_RANGE,
670 DEFAULT_CSV_NOT_IN_GAUGE_RANGE);
671
672 double a = gauge.getRange().getA().doubleValue();
673 double b = gauge.getRange().getB().doubleValue();
674
675 if (flys instanceof WINFOArtifact && isQ) {
676 desc = getCSVRowTitle((WINFOArtifact)flys, wqkms);
677 }
678 else if (!isQ) {
679 Double value = FLYSUtils.getValueFromWQ(wqkms);
680 desc = value != null
681 ? Formatter.getWaterlevelW(context).format(value) : null;
682 }
683
684 long startTime = System.currentTimeMillis();
685
686 for (int i = 0; i < size; i ++) {
687 result = wqkms.get(i, result);
688
689 if (atGauge) {
690 source.addData(new String[] {
691 kmf.format(result[2]),
692 wf.format(result[0]),
693 qf.format(result[1]),
694 desc,
695 FLYSUtils.getLocationDescription(flys, result[2]),
696 result[2] >= a && result[2] <= b
697 ? gaugeName
698 : notinrange
699 });
700 }
701 else {
702 source.addData(new String[] {
703 kmf.format(result[2]),
704 wf.format(result[0]),
705 qf.format(result[1]),
706 FLYSUtils.getLocationDescription(flys, result[2])
707 });
708 }
709 }
710
711 long stopTime = System.currentTimeMillis();
712
713 if (logger.isDebugEnabled()) {
714 logger.debug("Writing PDF data took " +
715 (float)(stopTime-startTime)/1000f + " secs.");
716 }
717
718 }
573 } 719 }
574 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 720 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org