Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/exports/FixWaterlevelExporter.java @ 9459:f06e3766997f
fallunterscheidung isQ - fixWaterlevelExporter
author | gernotbelger |
---|---|
date | Tue, 28 Aug 2018 19:21:44 +0200 |
parents | 65f28328c9a3 |
children | dd05a5eef210 |
comparison
equal
deleted
inserted
replaced
9458:7369d6ae3f87 | 9459:f06e3766997f |
---|---|
26 import org.dive4elements.river.artifacts.model.ConstantWQKms; | 26 import org.dive4elements.river.artifacts.model.ConstantWQKms; |
27 import org.dive4elements.river.artifacts.model.DischargeTables; | 27 import org.dive4elements.river.artifacts.model.DischargeTables; |
28 import org.dive4elements.river.artifacts.model.WQKms; | 28 import org.dive4elements.river.artifacts.model.WQKms; |
29 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; | 29 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; |
30 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; | 30 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; |
31 import org.dive4elements.river.model.DischargeTable; | |
31 import org.dive4elements.river.model.Gauge; | 32 import org.dive4elements.river.model.Gauge; |
32 import org.dive4elements.river.utils.Formatter; | 33 import org.dive4elements.river.utils.Formatter; |
33 import org.dive4elements.river.utils.RiverUtils; | 34 import org.dive4elements.river.utils.RiverUtils; |
34 import org.dive4elements.river.utils.RiverUtils.WQ_MODE; | 35 import org.dive4elements.river.utils.RiverUtils.WQ_MODE; |
35 | 36 |
49 | 50 |
50 private final Map<String, Double> gaugeQ_W_Map = new HashMap<>(); | 51 private final Map<String, Double> gaugeQ_W_Map = new HashMap<>(); |
51 | 52 |
52 @Override | 53 @Override |
53 protected void writeRow4(final CSVWriter writer, final double wqkm[], final D4EArtifact flys, final Gauge gauge) { | 54 protected void writeRow4(final CSVWriter writer, final double wqkm[], final D4EArtifact flys, final Gauge gauge) { |
54 final NumberFormat kmf = getKmFormatter(); | 55 if (!isQ()) { |
55 final NumberFormat wf = getWFormatter(); | 56 super.writeRow4(writer, wqkm, flys, gauge); |
56 final NumberFormat qf = getQFormatter(); | 57 } else { |
57 | 58 final NumberFormat kmf = getKmFormatter(); |
58 final String waterlevel = getWaterlevel(wqkm[1], gauge); | 59 final NumberFormat wf = getWFormatter(); |
59 | 60 final NumberFormat qf = getQFormatter(); |
60 writer.writeNext(new String[] { kmf.format(wqkm[2]), wf.format(wqkm[0]), waterlevel, qf.format(RiverUtils.roundQ(wqkm[1])), | 61 |
61 RiverUtils.getLocationDescription(flys, wqkm[2]) }); | 62 final String waterlevel = getWaterlevel(wqkm[1], gauge); |
63 | |
64 writer.writeNext(new String[] { kmf.format(wqkm[2]), wf.format(wqkm[0]), waterlevel, qf.format(RiverUtils.roundQ(wqkm[1])), | |
65 RiverUtils.getLocationDescription(flys, wqkm[2]) }); | |
66 } | |
62 } | 67 } |
63 | 68 |
64 /** Write an csv-row at gauge location. */ | 69 /** Write an csv-row at gauge location. */ |
65 @Override | 70 @Override |
66 protected void writeRow6(final CSVWriter writer, final double wqkm[], final String wOrQDesc, final D4EArtifact flys, final Gauge gauge) { | 71 protected void writeRow6(final CSVWriter writer, final double wqkm[], final String wOrQDesc, final D4EArtifact flys, final Gauge gauge) { |
67 final NumberFormat kmf = getKmFormatter(); | 72 if (!isQ()) { |
68 final NumberFormat wf = getWFormatter(); | 73 super.writeRow6(writer, wqkm, wOrQDesc, flys, gauge); |
69 final NumberFormat qf = getQFormatter(); | 74 } else { |
70 | 75 final NumberFormat kmf = getKmFormatter(); |
71 final String waterlevel = getWaterlevel(wqkm[1], gauge); | 76 final NumberFormat wf = getWFormatter(); |
72 | 77 final NumberFormat qf = getQFormatter(); |
73 writer.writeNext(new String[] { kmf.format(wqkm[2]), wf.format(wqkm[0]), waterlevel, qf.format(RiverUtils.roundQ(wqkm[1])), wOrQDesc, | 78 |
74 RiverUtils.getLocationDescription(flys, wqkm[2]), gauge.getName() }); | 79 final String waterlevel = getWaterlevel(wqkm[1], gauge); |
80 | |
81 writer.writeNext(new String[] { kmf.format(wqkm[2]), wf.format(wqkm[0]), waterlevel, qf.format(RiverUtils.roundQ(wqkm[1])), wOrQDesc, | |
82 RiverUtils.getLocationDescription(flys, wqkm[2]), gauge.getName() }); | |
83 } | |
75 } | 84 } |
76 | 85 |
77 private String getWaterlevel(final double discharge, final Gauge gauge) { | 86 private String getWaterlevel(final double discharge, final Gauge gauge) { |
78 final NumberFormat formatter = Formatter.getWaterlevelW(this.context); | 87 final NumberFormat formatter = Formatter.getWaterlevelW(this.context); |
79 final Double waterlevel = this.getWforGaugeAndQ(gauge, discharge); | 88 final Double waterlevel = this.getWforGaugeAndQ(gauge, discharge); |
80 return formatter.format(waterlevel); | 89 if (waterlevel != null) |
90 return formatter.format(waterlevel); | |
91 return ""; | |
81 } | 92 } |
82 | 93 |
83 private Double getWforGaugeAndQ(final Gauge gauge, final double q) { | 94 private Double getWforGaugeAndQ(final Gauge gauge, final double q) { |
84 | 95 |
85 final String key = gauge.getName() + String.valueOf(q); | 96 final String key = gauge.getName() + String.valueOf(q); |
86 if (!this.gaugeQ_W_Map.containsKey(key)) { | 97 if (!this.gaugeQ_W_Map.containsKey(key)) { |
87 | 98 |
88 final DischargeTables dct = new DischargeTables(gauge.getRiver().getName(), gauge.getName()); | 99 final DischargeTable dt = gauge.fetchMasterDischargeTable(); |
89 final double[] qs = DischargeTables.getWsForQ(dct.getFirstTable(), q); // TODO: KLÄREN, welche Abflusstabelle genommen werden soll! | 100 final double[][] table = DischargeTables.loadDischargeTableValues(dt); |
101 | |
102 final double[] qs = DischargeTables.getWsForQ(table, q); | |
103 | |
104 // final DischargeTables dct = new DischargeTables(gauge.getRiver().getName(), gauge.getName()); | |
105 // final double[] qs = DischargeTables.getWsForQ(dct.getFirstTable(), q); // TODO: KLÄREN, welche Abflusstabelle | |
106 // genommen werden soll! | |
90 if (qs != null && qs.length > 0) { | 107 if (qs != null && qs.length > 0) { |
91 this.gaugeQ_W_Map.put(key, qs[0]); | 108 this.gaugeQ_W_Map.put(key, qs[0]); |
92 } | 109 } |
93 } | 110 } |
94 return this.gaugeQ_W_Map.get(key); | 111 return this.gaugeQ_W_Map.get(key); |
99 * gauge or at a location. | 116 * gauge or at a location. |
100 */ | 117 */ |
101 | 118 |
102 @Override | 119 @Override |
103 protected void writeCSVHeader(final CSVWriter writer, final boolean atGauge, final boolean isQ) { | 120 protected void writeCSVHeader(final CSVWriter writer, final boolean atGauge, final boolean isQ) { |
104 log.info("WaterlevelExporter.writeCSVHeader"); | 121 if (!isQ()) { |
105 | 122 super.writeCSVHeader(writer, atGauge, isQ); |
106 final String unit = RiverUtils.getRiver((D4EArtifact) this.master).getWstUnit().getName(); | 123 } else { |
107 | 124 log.info("WaterlevelExporter.writeCSVHeader"); |
108 final String headerWamPegelNeu = msg("fix.export.csv.w_at_gauge"); | 125 |
109 | 126 final String unit = RiverUtils.getRiver((D4EArtifact) this.master).getWstUnit().getName(); |
110 if (atGauge) { | 127 |
111 writer.writeNext(new String[] { msg(CSV_KM_HEADER, DEFAULT_CSV_KM_HEADER), msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER, new Object[] { unit }), | 128 final String headerWamPegelNeu = msg("fix.export.csv.w_at_gauge"); |
112 headerWamPegelNeu, msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER), | 129 |
113 | 130 if (atGauge) { |
114 // FIXME: use WaterlevelDescriptionBuilder instead and also remove all this duplicate code. | 131 writer.writeNext(new String[] { msg(CSV_KM_HEADER, DEFAULT_CSV_KM_HEADER), msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER, new Object[] { unit }), |
115 (isQ ? msg(CSV_Q_DESC_HEADER, DEFAULT_CSV_Q_DESC_HEADER) : msg(CSV_W_DESC_HEADER, DEFAULT_CSV_W_DESC_HEADER)), | 132 headerWamPegelNeu, msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER), |
116 msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER), msg(CSV_GAUGE_HEADER, DEFAULT_CSV_GAUGE_HEADER) }); | 133 |
117 } else { | 134 // FIXME: use WaterlevelDescriptionBuilder instead and also remove all this duplicate code. |
118 writer.writeNext(new String[] { msg(CSV_KM_HEADER, DEFAULT_CSV_KM_HEADER), msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER, new Object[] { unit }), | 135 (isQ ? msg(CSV_Q_DESC_HEADER, DEFAULT_CSV_Q_DESC_HEADER) : msg(CSV_W_DESC_HEADER, DEFAULT_CSV_W_DESC_HEADER)), |
119 headerWamPegelNeu, msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER), msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER) }); | 136 msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER), msg(CSV_GAUGE_HEADER, DEFAULT_CSV_GAUGE_HEADER) }); |
137 } else { | |
138 writer.writeNext(new String[] { msg(CSV_KM_HEADER, DEFAULT_CSV_KM_HEADER), msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER, new Object[] { unit }), | |
139 headerWamPegelNeu, msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER), msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER) }); | |
140 } | |
120 } | 141 } |
121 } | 142 } |
122 | 143 |
123 @Override | 144 @Override |
124 protected void writePDF(final OutputStream out) { | 145 protected void writePDF(final OutputStream out) { |
125 | 146 |
126 log.debug("write PDF"); | 147 log.debug("write PDF"); |
127 | 148 |
128 final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); | 149 if (!isQ()) { |
129 final String jasperFile = "/jasper/templates/fix_waterlevel.jrxml"; // "/jasper/fix_waterlevel_en.jasper"); | 150 super.writePDF(out); |
130 | 151 } else { |
131 addMetaData(source); | 152 |
132 try { | 153 final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); |
133 final List<String[]> sorted = getRows(); // Custom Result could be nice, too... | 154 final String jasperFile = "/jasper/templates/fix_waterlevel.jrxml"; // "/jasper/fix_waterlevel_en.jasper"); |
134 for (final String[] list : sorted) { | 155 |
135 source.addData(list); | 156 addMetaData(source); |
136 } | 157 try { |
137 | 158 final List<String[]> sorted = getRows(); // Custom Result could be nice, too... |
138 final JasperReporter reporter = new JasperReporter(); | 159 for (final String[] list : sorted) { |
139 reporter.addReport(jasperFile, source); | 160 source.addData(list); |
140 reporter.exportPDF(out); | 161 } |
141 } | 162 |
142 catch (final JRException je) { | 163 final JasperReporter reporter = new JasperReporter(); |
143 log.warn("Error generating PDF Report!", je); | 164 reporter.addReport(jasperFile, source); |
165 reporter.exportPDF(out); | |
166 } | |
167 catch (final JRException je) { | |
168 log.warn("Error generating PDF Report!", je); | |
169 } | |
144 } | 170 } |
145 } | 171 } |
146 | 172 |
147 private void addMetaData(final MetaAndTableJRDataSource source) { | 173 private void addMetaData(final MetaAndTableJRDataSource source) { |
148 final D4EArtifact flys = (D4EArtifact) this.master; | 174 final D4EArtifact flys = (D4EArtifact) this.master; |
206 list.addAll(getRows2(filterWQKms(wqkms, first, last), atGauge, isQ)); | 232 list.addAll(getRows2(filterWQKms(wqkms, first, last), atGauge, isQ)); |
207 } | 233 } |
208 return list; | 234 return list; |
209 } | 235 } |
210 | 236 |
211 protected List<String[]> getRows2(final WQKms wqkms, final boolean atGauge, final boolean isQ) { | 237 private List<String[]> getRows2(final WQKms wqkms, final boolean atGauge, final boolean isQ) { |
212 log.debug("WaterlevelExporter.addWKmsData"); // OLD CODE :-/ | 238 log.debug("WaterlevelExporter.addWKmsData"); // OLD CODE :-/ |
213 | 239 |
214 final List<String[]> list = new ArrayList<>(); | 240 final List<String[]> list = new ArrayList<>(); |
215 // Skip constant data. | 241 // Skip constant data. |
216 if (wqkms instanceof ConstantWQKms) { | 242 if (wqkms instanceof ConstantWQKms) { |