Mercurial > dive4elements > river
comparison 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 |
comparison
equal
deleted
inserted
replaced
5837:d9901a08d0a6 | 5838:5aa05a7a34b7 |
---|---|
1 package org.dive4elements.river.exports; | |
2 | |
3 import au.com.bytecode.opencsv.CSVWriter; | |
4 | |
5 import org.dive4elements.artifacts.CallContext; | |
6 import org.dive4elements.artifacts.CallMeta; | |
7 | |
8 import org.dive4elements.artifacts.common.utils.Config; | |
9 | |
10 import org.dive4elements.river.artifacts.FLYSArtifact; | |
11 import org.dive4elements.river.artifacts.WINFOArtifact; | |
12 | |
13 import org.dive4elements.river.artifacts.model.CalculationResult; | |
14 import org.dive4elements.river.artifacts.model.WWQQ; | |
15 import org.dive4elements.river.artifacts.model.WWQQJRDataSource; | |
16 | |
17 import org.dive4elements.river.artifacts.resources.Resources; | |
18 | |
19 import org.dive4elements.river.utils.FLYSUtils; | |
20 | |
21 import java.io.IOException; | |
22 import java.io.OutputStream; | |
23 | |
24 import java.text.DateFormat; | |
25 import java.text.NumberFormat; | |
26 | |
27 import java.util.ArrayList; | |
28 import java.util.Date; | |
29 import java.util.HashMap; | |
30 import java.util.List; | |
31 import java.util.Locale; | |
32 import java.util.Map; | |
33 | |
34 import net.sf.jasperreports.engine.JRException; | |
35 import net.sf.jasperreports.engine.JasperExportManager; | |
36 import net.sf.jasperreports.engine.JasperFillManager; | |
37 import net.sf.jasperreports.engine.JasperPrint; | |
38 | |
39 import org.apache.log4j.Logger; | |
40 | |
41 import org.w3c.dom.Document; | |
42 | |
43 /** | |
44 * (CSV)Exporter for Reference Curves. | |
45 */ | |
46 public class ReferenceCurveExporter extends AbstractExporter { | |
47 | |
48 /** The logger used in this exporter. */ | |
49 private static Logger logger = Logger.getLogger(ReferenceCurveExporter.class); | |
50 | |
51 public static final String RC_CSV_KM_HEADER = | |
52 "export.reference_curve.csv.header.km"; | |
53 | |
54 public static final String RC_CSV_W_CM_HEADER = | |
55 "export.reference_curve.csv.header.w.cm"; | |
56 | |
57 public static final String RC_CSV_W_M_HEADER = | |
58 "export.reference_curve.csv.header.w.m"; | |
59 | |
60 public static final String RC_CSV_Q_HEADER = | |
61 "export.reference_curve.csv.header.w.q"; | |
62 | |
63 public static final String CSV_LOCATION_HEADER = | |
64 "export.waterlevel.csv.header.location"; | |
65 | |
66 public static final String DEFAULT_CSV_LOCATION_HEADER = "Lage"; | |
67 | |
68 public static final String RC_DEFAULT_CSV_KM_HEADER = "Fluss-Km"; | |
69 public static final String RC_DEFAULT_CSV_W_M_HEADER = "W (m + NHN)"; | |
70 public static final String RC_DEFAULT_CSV_W_CM_HEADER = "W (cm am Pegel)"; | |
71 public static final String RC_DEFAULT_CSV_Q_HEADER = "gleichw. Q (m\u00b3/s)"; | |
72 | |
73 public static final String PDF_HEADER_MODE = "export.reference_curve.pdf.mode"; | |
74 public static final String JASPER_FILE = "export.reference_curve.pdf.file"; | |
75 public static final String JASPER_FILE_GAUGE = "export.reference_curve.pdf.file.gauge"; | |
76 public static final String JASPER_FILE_GAUGE_END = "export.reference_curve.pdf.file.gauge.end"; | |
77 public static final String JASPER_FILE_GAUGE_START_END = "export.reference_curve.pdf.file.gauge.start.end"; | |
78 | |
79 /** The storage that contains all WKms objects for the different facets. */ | |
80 protected List<WWQQ[]> data; | |
81 | |
82 protected boolean startAtGauge = false; | |
83 | |
84 protected boolean endAtGauge = false; | |
85 | |
86 | |
87 @Override | |
88 public void init(Document request, OutputStream out, CallContext context) { | |
89 logger.debug("ReferenceCurveExporter.init"); | |
90 | |
91 super.init(request, out, context); | |
92 | |
93 this.data = new ArrayList<WWQQ[]>(); | |
94 } | |
95 | |
96 | |
97 /** | |
98 * Genereate data in csv format. | |
99 */ | |
100 @Override | |
101 public void generate() | |
102 throws IOException | |
103 { | |
104 logger.debug("ReferenceCurveExporter.generate"); | |
105 | |
106 if (facet == null) { | |
107 throw new IOException("invalid (null) facet for exporter"); | |
108 } | |
109 else if (facet.equals(AbstractExporter.FACET_CSV)) { | |
110 generateCSV(); | |
111 } | |
112 else if (facet.equals(AbstractExporter.FACET_PDF)) { | |
113 generatePDF(); | |
114 } | |
115 else { | |
116 throw new IOException("invalid facet (" + facet + ") for exporter"); | |
117 } | |
118 } | |
119 | |
120 | |
121 /** | |
122 * Adds given data. | |
123 * @param d A CalculationResult with WWQQ[]. | |
124 */ | |
125 @Override | |
126 protected void addData(Object d) { | |
127 logger.debug("ReferenceCurveExporter.addData"); | |
128 | |
129 if (d instanceof CalculationResult) { | |
130 d = ((CalculationResult)d).getData(); | |
131 if (d instanceof WWQQ []) { | |
132 WWQQ[] wwqqs = (WWQQ []) d; | |
133 for (WWQQ wwqq: wwqqs) { | |
134 if (wwqq.startAtGauge()) { | |
135 startAtGauge = true; | |
136 } | |
137 // TODO this one probably has to be inverted. | |
138 if (wwqq.endAtGauge()) { | |
139 endAtGauge = true; | |
140 } | |
141 } | |
142 data.add(wwqqs); | |
143 logger.debug("ReferenceCurveExporter.addData wwqq[]."); | |
144 } | |
145 else { | |
146 logger.warn("ReferenceCurveExporter.addData/1 unknown type (" | |
147 + d + ")."); | |
148 } | |
149 } | |
150 else { | |
151 logger.warn("ReferenceCurveExporter.addData/2 unknown type (" | |
152 + d + ")."); | |
153 } | |
154 } | |
155 | |
156 | |
157 /** | |
158 * Lets writer write all data (including header). | |
159 * @param writer Writer to write data with. | |
160 */ | |
161 @Override | |
162 protected void writeCSVData(CSVWriter writer) { | |
163 logger.debug("ReferenceCurveExporter.writeData"); | |
164 | |
165 writeCSVHeader(writer); | |
166 | |
167 for (WWQQ[] tmp: data) { | |
168 for (WWQQ ww: tmp) { | |
169 wWQQ2CSV(writer, ww); | |
170 } | |
171 } | |
172 } | |
173 | |
174 | |
175 /** | |
176 * Lets csvwriter write the header (first line in file). | |
177 * @param writer Writer to write header with. | |
178 */ | |
179 protected void writeCSVHeader(CSVWriter writer) { | |
180 logger.info("ReferenceCurveExporter.writeCSVHeader"); | |
181 | |
182 StepCSVWriter stepWriter = new StepCSVWriter(); | |
183 stepWriter.setCSVWriter(writer); | |
184 | |
185 stepWriter.addNexts( | |
186 msg(RC_CSV_KM_HEADER, RC_DEFAULT_CSV_KM_HEADER), | |
187 msg(RC_CSV_W_M_HEADER, RC_DEFAULT_CSV_W_M_HEADER) | |
188 ); | |
189 if (startAtGauge) { | |
190 stepWriter.addNext( | |
191 msg(RC_CSV_W_CM_HEADER, RC_DEFAULT_CSV_W_CM_HEADER)); | |
192 } | |
193 stepWriter.addNexts( | |
194 msg(RC_CSV_Q_HEADER, RC_DEFAULT_CSV_Q_HEADER), | |
195 msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER), | |
196 msg(RC_CSV_KM_HEADER, RC_DEFAULT_CSV_KM_HEADER), | |
197 msg(RC_CSV_W_M_HEADER, RC_DEFAULT_CSV_W_M_HEADER) | |
198 ); | |
199 if (endAtGauge) { | |
200 stepWriter.addNext( | |
201 msg(RC_CSV_W_CM_HEADER, RC_DEFAULT_CSV_W_CM_HEADER) | |
202 ); | |
203 } | |
204 stepWriter.addNexts( | |
205 msg(RC_CSV_Q_HEADER, RC_DEFAULT_CSV_Q_HEADER), | |
206 msg(CSV_LOCATION_HEADER, DEFAULT_CSV_LOCATION_HEADER) | |
207 ); | |
208 | |
209 stepWriter.flush(); | |
210 } | |
211 | |
212 | |
213 protected void wWQQ2CSV(CSVWriter writer, WWQQ ww) { | |
214 logger.debug("ReferenceCurveExporter.wWQQ2CSV"); | |
215 | |
216 NumberFormat kmf = getKmFormatter(); | |
217 NumberFormat wf = getWFormatter(); | |
218 NumberFormat qf = getQFormatter(); | |
219 | |
220 int size = ww.size(); | |
221 | |
222 FLYSArtifact flys = (FLYSArtifact) master; | |
223 | |
224 StepCSVWriter stepWriter = new StepCSVWriter(); | |
225 stepWriter.setCSVWriter(writer); | |
226 | |
227 String startLocationDescription = FLYSUtils.getLocationDescription( | |
228 flys, ww.getStartKm()); | |
229 | |
230 String endLocationDescription = FLYSUtils.getLocationDescription( | |
231 flys, ww.getEndKm()); | |
232 | |
233 for (int i = 0; i < size; i ++) { | |
234 stepWriter.addNexts(kmf.format(ww.getStartKm())); | |
235 stepWriter.addNext(wf.format(ww.getW1(i))); | |
236 if (startAtGauge) { | |
237 stepWriter.addNext(wf.format(ww.getRelHeight1Cm(i))); | |
238 } | |
239 stepWriter.addNexts( | |
240 qf.format(ww.getQ1(i)), // "Q" | |
241 startLocationDescription, | |
242 kmf.format(ww.getEndKm()) | |
243 ); | |
244 stepWriter.addNext(wf.format(ww.getW2(i))); | |
245 if (endAtGauge) { | |
246 if (ww.endAtGauge()) { | |
247 stepWriter.addNext(wf.format(ww.getRelHeight2Cm(i))); | |
248 } | |
249 else { | |
250 stepWriter.addNext("-"); | |
251 } | |
252 } | |
253 stepWriter.addNexts( | |
254 qf.format(ww.getQ2(i)), // "Q" | |
255 endLocationDescription | |
256 ); | |
257 stepWriter.flush(); | |
258 } | |
259 } | |
260 | |
261 | |
262 @Override | |
263 protected void writePDF(OutputStream out) { | |
264 WWQQJRDataSource source = createJRData(); | |
265 | |
266 String filename = JASPER_FILE; | |
267 if (startAtGauge && endAtGauge) { | |
268 filename = JASPER_FILE_GAUGE_START_END; | |
269 } | |
270 else if (startAtGauge) { | |
271 filename = JASPER_FILE_GAUGE; | |
272 } | |
273 else if (endAtGauge) { | |
274 filename = JASPER_FILE_GAUGE_END; | |
275 } | |
276 | |
277 String jasperFile = Resources.getMsg( | |
278 context.getMeta(), | |
279 filename, | |
280 "/jasper/reference_en.jasper"); | |
281 String confPath = Config.getConfigDirectory().toString(); | |
282 | |
283 Map parameters = new HashMap(); | |
284 parameters.put("ReportTitle", "Exported Data"); | |
285 try { | |
286 JasperPrint print = JasperFillManager.fillReport( | |
287 confPath + jasperFile, | |
288 parameters, | |
289 source); | |
290 JasperExportManager.exportReportToPdfStream(print, out); | |
291 } | |
292 catch(JRException je) { | |
293 logger.warn("Error generating PDF Report!"); | |
294 je.printStackTrace(); | |
295 } | |
296 } | |
297 | |
298 protected WWQQJRDataSource createJRData() { | |
299 WWQQJRDataSource source = new WWQQJRDataSource(); | |
300 | |
301 addMetaData(source); | |
302 | |
303 for (WWQQ[] tmp: data) { | |
304 for (WWQQ ww: tmp) { | |
305 addWWQQData(source, ww); | |
306 } | |
307 } | |
308 return source; | |
309 } | |
310 | |
311 | |
312 protected void addMetaData(WWQQJRDataSource source) { | |
313 CallMeta meta = context.getMeta(); | |
314 | |
315 WINFOArtifact flys = (WINFOArtifact) master; | |
316 | |
317 source.addMetaData ("river", FLYSUtils.getRivername(flys)); | |
318 | |
319 Locale locale = Resources.getLocale(meta); | |
320 DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); | |
321 | |
322 source.addMetaData("date", df.format(new Date())); | |
323 | |
324 source.addMetaData("calculation", Resources.getMsg( | |
325 locale, | |
326 PDF_HEADER_MODE, | |
327 "Reference Curve")); | |
328 } | |
329 | |
330 | |
331 protected void addWWQQData(WWQQJRDataSource source, WWQQ ww) { | |
332 NumberFormat kmf = getKmFormatter(); | |
333 NumberFormat wf = getWFormatter(); | |
334 NumberFormat qf = getQFormatter(); | |
335 | |
336 int size = ww.size(); | |
337 | |
338 FLYSArtifact flys = (FLYSArtifact) master; | |
339 | |
340 String startLocationDescription = FLYSUtils.getLocationDescription( | |
341 flys, ww.getStartKm()); | |
342 | |
343 String endLocationDescription = FLYSUtils.getLocationDescription( | |
344 flys, ww.getEndKm()); | |
345 | |
346 for (int i = 0; i < size; i ++) { | |
347 String start = "-"; | |
348 String end = "-"; | |
349 if (startAtGauge) { | |
350 start = wf.format(ww.getRelHeight1Cm(i)); | |
351 } | |
352 if (ww.endAtGauge()) { | |
353 end = wf.format(ww.getRelHeight2Cm(i)); | |
354 } | |
355 source.addData(new String[] { | |
356 kmf.format(ww.getStartKm()), | |
357 startLocationDescription, | |
358 wf.format(ww.getW1(i)), | |
359 qf.format(ww.getQ1(i)), // "Q" | |
360 kmf.format(ww.getEndKm()), | |
361 endLocationDescription, | |
362 wf.format(ww.getW2(i)), | |
363 qf.format(ww.getQ2(i)), // "Q" | |
364 start, | |
365 end | |
366 }); | |
367 } | |
368 } | |
369 } | |
370 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |