Mercurial > dive4elements > river
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 : |