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 :

http://dive4elements.wald.intevation.org