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) {

http://dive4elements.wald.intevation.org