comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoExporter.java @ 9000:50cc99579a46

Work on uinfo
author gernotbelger
date Thu, 12 Apr 2018 19:16:10 +0200
parents 27851cfda84a
children 460fcc128794
comparison
equal deleted inserted replaced
8999:e3b3ce32c825 9000:50cc99579a46
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the 7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
8 * documentation coming with Dive4Elements River for details. 8 * documentation coming with Dive4Elements River for details.
9 */ 9 */
10 package org.dive4elements.river.artifacts.sinfo.common; 10 package org.dive4elements.river.artifacts.sinfo.common;
11 11
12 import java.io.OutputStream;
13 import java.text.DateFormat; 12 import java.text.DateFormat;
14 import java.text.NumberFormat; 13 import java.text.NumberFormat;
15 import java.util.Collection;
16 import java.util.Date; 14 import java.util.Date;
17 import java.util.HashMap;
18 import java.util.Locale; 15 import java.util.Locale;
19 import java.util.Map;
20 16
21 import org.apache.commons.lang.math.DoubleRange; 17 import org.apache.commons.lang.math.DoubleRange;
22 import org.apache.log4j.Logger;
23 import org.dive4elements.artifacts.CallMeta;
24 import org.dive4elements.artifacts.common.utils.Config;
25 import org.dive4elements.river.FLYS; 18 import org.dive4elements.river.FLYS;
26 import org.dive4elements.river.artifacts.model.CalculationResult; 19 import org.dive4elements.river.artifacts.common.AbstractCommonExporter;
20 import org.dive4elements.river.artifacts.common.GeneralResultType;
21 import org.dive4elements.river.artifacts.common.I18NStrings;
27 import org.dive4elements.river.artifacts.resources.Resources; 22 import org.dive4elements.river.artifacts.resources.Resources;
28 import org.dive4elements.river.artifacts.sinfo.SInfoI18NStrings;
29 import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; 23 import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo;
30 import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource; 24 import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource;
31 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; 25 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
32 import org.dive4elements.river.artifacts.sinfo.util.WstInfo; 26 import org.dive4elements.river.artifacts.sinfo.util.WstInfo;
33 import org.dive4elements.river.exports.AbstractExporter;
34 27
35 import au.com.bytecode.opencsv.CSVWriter; 28 import au.com.bytecode.opencsv.CSVWriter;
36 import net.sf.jasperreports.engine.JRDataSource;
37 import net.sf.jasperreports.engine.JRException;
38 import net.sf.jasperreports.engine.JasperExportManager;
39 import net.sf.jasperreports.engine.JasperFillManager;
40 import net.sf.jasperreports.engine.JasperPrint;
41 29
42 /** 30 /**
43 * @author Gernot Belger 31 * @author Gernot Belger
44 */ 32 */
45 public abstract class AbstractSInfoExporter<RESULT extends AbstractSInfoCalculationResult, RESULTS extends AbstractSInfoCalculationResults<RESULT>> extends AbstractExporter { 33 public abstract class AbstractSInfoExporter<RESULT extends AbstractSInfoCalculationResult, RESULTS extends AbstractSInfoCalculationResults<RESULT>> extends AbstractCommonExporter<RESULT, RESULTS> {
46 34
47 private static final String CSV_META_HEADER_SOUNDING = "sinfo.export.flow_depth.csv.meta.header.sounding"; 35 private static final String CSV_META_HEADER_SOUNDING = "sinfo.export.flow_depth.csv.meta.header.sounding";
48 36
49 private static final String CSV_META_HEADER_SOUNDING_YEAR = "sinfo.export.flow_depth.csv.meta.header.sounding.year"; 37 private static final String CSV_META_HEADER_SOUNDING_YEAR = "sinfo.export.flow_depth.csv.meta.header.sounding.year";
50 38
51 private static final String CSV_META_HEADER_SOUNDING_TYPE = "sinfo.export.flow_depth.csv.meta.header.sounding.type"; 39 private static final String CSV_META_HEADER_SOUNDING_TYPE = "sinfo.export.flow_depth.csv.meta.header.sounding.type";
52 40
53 private static final String CSV_META_HEADER_SOUNDING_EVALUATOR = "sinfo.export.flow_depth.csv.meta.header.sounding.evaluator";
54
55 private static final String CSV_META_HEADER_SOUNDING_PRJ = "sinfo.export.flow_depth.csv.meta.header.sounding.prj"; 41 private static final String CSV_META_HEADER_SOUNDING_PRJ = "sinfo.export.flow_depth.csv.meta.header.sounding.prj";
56 42
57 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel"; 43 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel";
58 44
59 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original"; 45 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original";
60
61 /** The storage that contains the current calculation result. */
62 private RESULTS data = null;
63
64 protected abstract Logger getLog();
65
66 public RESULTS getData() {
67 return this.data;
68 }
69
70 @Override
71 protected final void addData(final Object d) {
72 /* reset */
73 this.data = null;
74
75 if (d instanceof CalculationResult) {
76
77 final Object dat = ((CalculationResult) d).getData();
78 if (dat != null) {
79 @SuppressWarnings("unchecked")
80 final RESULTS result = (RESULTS) dat;
81 this.data = result;
82 }
83 }
84 }
85
86 /**
87 * Formats header with unit and label: msg [unit] (label)
88 */
89 protected final String msgUnitLabel(final String key, final String unit, final String label) {
90 final String msg = msg(key);
91 return String.format("%s [%s] (%s)", msg, unit, label);
92 }
93
94 @Override
95 protected final void writeCSVData(final CSVWriter writer) {
96 getLog().info("writeCSVData");
97
98 /* fetch calculation results */
99 final RESULTS results = this.data;
100
101 final RiverInfo river = results.getRiver();
102
103 /* write as csv */
104 writeCSVGlobalMetadata(writer, results);
105 writeCSVHeader(writer, results, river);
106
107 for (final RESULT result : results.getResults()) {
108 writeCSVResult(writer, results, result);
109 }
110 }
111
112 protected abstract void writeCSVHeader(final CSVWriter writer, final RESULTS results, final RiverInfo river);
113
114 /**
115 * Add metadata that is once written to the top of the file.
116 */
117 protected abstract void writeCSVGlobalMetadata(final CSVWriter writer, final RESULTS results);
118
119 protected final void writeCSVMetaEntry(final CSVWriter writer, final String message, final Object... messageArgs) {
120
121 final CallMeta meta = this.context.getMeta();
122
123 writer.writeNext(new String[] { Resources.getMsg(meta, message, message, messageArgs) });
124 }
125
126 protected final void writeCSVResult(final CSVWriter writer, final RESULTS results, final RESULT result) {
127
128 writeCSVResultMetadata(writer, results, result);
129
130 /* nwo the value rows */
131 final Collection<SInfoResultRow> rows = result.getRows();
132 for (final SInfoResultRow row : rows) {
133 writeCSVRow(writer, results, result, row);
134 }
135 }
136
137 /**
138 * Add metadata that is written once per result set.
139 */
140 protected abstract void writeCSVResultMetadata(CSVWriter writer, RESULTS results, RESULT result);
141
142 protected final void writeCSVRow(final CSVWriter writer, final RESULTS results, final RESULT result, final SInfoResultRow row) {
143 getLog().debug("writeCSVFlowDepthRow");
144
145 final String[] formattedRow = formatCSVRow(results, result, row);
146 writer.writeNext(formattedRow);
147 }
148
149 protected abstract String[] formatCSVRow(RESULTS results, RESULT result, final SInfoResultRow row);
150
151 @Override
152 protected final void writePDF(final OutputStream outStream) {
153 getLog().debug("write PDF");
154
155 final JRDataSource source = createJRData();
156
157 final String confPath = Config.getConfigDirectory().toString();
158
159 // FIXME: distinguish between with and without tkh: we need two jasper reports!
160
161 final Map<String, Object> parameters = new HashMap<>();
162 parameters.put("ReportTitle", "Exported Data");
163
164 try {
165 final String jasperPath = confPath + getJasperFile();
166
167 final JasperPrint print = JasperFillManager.fillReport(jasperPath, parameters, source);
168 JasperExportManager.exportReportToPdfStream(print, outStream);
169 }
170 catch (final JRException je) {
171 getLog().warn("Error generating PDF Report!", je);
172 }
173 }
174
175 protected abstract String getJasperFile();
176
177 private JRDataSource createJRData() {
178
179 /* fetch calculation results */
180 final RESULTS results = this.data;
181
182 final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource();
183
184 addJRMetaData(source, results);
185
186 for (final RESULT result : results.getResults()) {
187 addJRTableData(source, results, result);
188 }
189
190 return source;
191 }
192
193 protected abstract void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results);
194
195 protected final void addJRTableData(final MetaAndTableJRDataSource source, final RESULTS results, final RESULT result) {
196
197 final Collection<SInfoResultRow> rows = result.getRows();
198
199 for (final SInfoResultRow row : rows) {
200
201 final String[] formattedRow = formatPDFRow(results, row);
202 source.addData(formattedRow);
203 }
204 }
205
206 protected abstract String[] formatPDFRow(RESULTS results, final SInfoResultRow row);
207
208 protected final void writeCSVGlobalMetadataDefaults(final CSVWriter writer, final AbstractSInfoCalculationResults<?> results) {
209
210 final String calcModeLabel = results.getCalcModeLabel();
211 final RiverInfo river = results.getRiver();
212 final DoubleRange calcRange = results.getCalcRange();
213
214 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_RESULT, msg(SInfoI18NStrings.CSV_META_HEADER_RESULT_LABEL), river.getName(), calcModeLabel);
215
216 // "# FLYS-Version: "
217 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_VERSION, msg(SInfoI18NStrings.CSV_META_VERSION_LABEL), FLYS.VERSION);
218
219 // "# Bearbeiter: "
220 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_USER, msg(SInfoI18NStrings.CSV_META_USER_LABEL), results.getUser());
221
222 // "# Datum der Erstellung: "
223 final Locale locale = Resources.getLocale(this.context.getMeta());
224 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
225 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_CREATION, msg(SInfoI18NStrings.CSV_META_CREATION_LABEL), df.format(new Date()));
226
227 // "# Gewässer: "
228 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_RIVER, msg(SInfoI18NStrings.CSV_META_RIVER_LABEL), river.getName());
229
230 // "# Höhensystem des Flusses: "
231 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit());
232
233 // "# Ort/Bereich (km): "
234 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_RANGE, msg(SInfoI18NStrings.CSV_META_RANGE_LABEL),
235 getKmFormatter().format(calcRange.getMinimumDouble()), getKmFormatter().format(calcRange.getMaximumDouble()));
236 }
237 46
238 protected final void writeCSVSoundingMetadata(final CSVWriter writer, final BedHeightInfo sounding) { 47 protected final void writeCSVSoundingMetadata(final CSVWriter writer, final BedHeightInfo sounding) {
239 writeCSVSoundingMetadata(writer, sounding, CSV_META_HEADER_SOUNDING); 48 writeCSVSoundingMetadata(writer, sounding, CSV_META_HEADER_SOUNDING);
240 } 49 }
241 50
246 // "# Jahr der Peilung: " 55 // "# Jahr der Peilung: "
247 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_YEAR, Integer.toString(sounding.getYear())); 56 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_YEAR, Integer.toString(sounding.getYear()));
248 // "# Aufnahmeart: " 57 // "# Aufnahmeart: "
249 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_TYPE, sounding.getType()); 58 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_TYPE, sounding.getType());
250 // "# Auswerter: " 59 // "# Auswerter: "
251 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_EVALUATOR, sounding.getEvaluationBy()); 60 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_EVALUATOR, sounding.getEvaluationBy());
252 // "# Lagesystem: " 61 // "# Lagesystem: "
253 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_PRJ, sounding.getLocationSystem()); 62 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_PRJ, sounding.getLocationSystem());
254 // "# Höhensystem: " 63 // "# Höhensystem: "
255 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL, sounding.getCurElevationModelUnit()); 64 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL, sounding.getCurElevationModelUnit());
256 // "# ursprüngliches Höhensystem: " 65 // "# ursprüngliches Höhensystem: "
275 final int year = wst.getYear(); 84 final int year = wst.getYear();
276 if (year > 0) 85 if (year > 0)
277 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_YEAR, Integer.toString(year)); 86 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_YEAR, Integer.toString(year));
278 } 87 }
279 88
280 protected final void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final AbstractSInfoCalculationResults<?> results) { 89 @Override
90 protected void writeCSVGlobalMetadataDefaults(final CSVWriter writer, final RESULTS results) {
91
92 final String calcModeLabel = results.getCalcModeLabel();
93 final RiverInfo river = results.getRiver();
94 final DoubleRange calcRange = results.getCalcRange();
95
96 writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEADER_RESULT, msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL), river.getName(), calcModeLabel);
97
98 // "# FLYS-Version: "
99 writeCSVMetaEntry(writer, I18NStrings.CSV_META_VERSION, msg(I18NStrings.CSV_META_VERSION_LABEL), FLYS.VERSION);
100
101 // "# Bearbeiter: "
102 writeCSVMetaEntry(writer, I18NStrings.CSV_META_USER, msg(I18NStrings.CSV_META_USER_LABEL), results.getUser());
103
104 // "# Datum der Erstellung: "
105 final Locale locale = Resources.getLocale(this.context.getMeta());
106 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
107 writeCSVMetaEntry(writer, I18NStrings.CSV_META_CREATION, msg(I18NStrings.CSV_META_CREATION_LABEL), df.format(new Date()));
108
109 // "# Gewässer: "
110 writeCSVMetaEntry(writer, I18NStrings.CSV_META_RIVER, msg(I18NStrings.CSV_META_RIVER_LABEL), river.getName());
111
112 // "# Höhensystem des Flusses: "
113 writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit());
114
115 if (calcRange != null) {
116 // "# Ort/Bereich (km): "
117 writeCSVMetaEntry(writer, I18NStrings.CSV_META_RANGE, msg(I18NStrings.CSV_META_RANGE_LABEL), getKmFormatter().format(calcRange.getMinimumDouble()),
118 getKmFormatter().format(calcRange.getMaximumDouble()));
119 }
120 }
121
122 @Override
123 protected void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results) {
124
125 /* general metadata */
126 this.addJRMetaDataDefaults(source, results);
281 127
282 final RiverInfo river = results.getRiver(); 128 final RiverInfo river = results.getRiver();
283 final String wstUnitName = river.getWstUnit(); 129 final String wstUnitName = river.getWstUnit();
284 130
285 source.addMetaData("header", msg(SInfoI18NStrings.CSV_META_HEADER_RESULT_LABEL)); 131 source.addMetaData("river_label", msg(I18NStrings.CSV_META_RIVER_LABEL));
286 source.addMetaData("calcMode", results.getCalcModeLabel());
287
288 source.addMetaData("version_label", msg(SInfoI18NStrings.CSV_META_VERSION_LABEL));
289 source.addMetaData("version", FLYS.VERSION);
290
291 source.addMetaData("user_label", msg(SInfoI18NStrings.CSV_META_USER_LABEL));
292 source.addMetaData("user", results.getUser());
293
294 final Locale locale = Resources.getLocale(this.context.getMeta());
295 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
296 source.addMetaData("date_label", msg(SInfoI18NStrings.CSV_META_CREATION_LABEL));
297 source.addMetaData("date", df.format(new Date()));
298
299 source.addMetaData("river_label", msg(SInfoI18NStrings.CSV_META_RIVER_LABEL));
300 source.addMetaData("river", river.getName()); 132 source.addMetaData("river", river.getName());
301 source.addMetaData("river_unit", wstUnitName); 133 source.addMetaData("river_unit", wstUnitName);
302 134
303 final DoubleRange calcRange = results.getCalcRange(); 135 final DoubleRange calcRange = results.getCalcRange();
304 final NumberFormat kmFormatter = getKmFormatter(); 136 final NumberFormat kmFormatter = getKmFormatter();
305 final String rangeValue = String.format("%s - %s", kmFormatter.format(calcRange.getMinimumDouble()), kmFormatter.format(calcRange.getMaximumDouble())); 137 final String rangeValue = String.format("%s - %s", kmFormatter.format(calcRange.getMinimumDouble()), kmFormatter.format(calcRange.getMaximumDouble()));
306 source.addMetaData("range_label", msg(SInfoI18NStrings.CSV_META_RANGE_LABEL)); 138 source.addMetaData("range_label", msg(I18NStrings.CSV_META_RANGE_LABEL));
307 source.addMetaData("range", rangeValue); 139 source.addMetaData("range", rangeValue);
140
141 /* column headings */
142 // source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); // moved to
143 // super
144
145 // TODO: move to subs
146 /* column headings */
147 source.addMetaData("flowdepth_header", SInfoResultType.flowdepth.getPdfHeader(this.context.getMeta()));
148 source.addMetaData("flowdepth_tkh_header", SInfoResultType.flowdepthtkh.getPdfHeader(this.context.getMeta()));
149 source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta()));
150 source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta()));
151 source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta()));
152 source.addMetaData("waterlevel_name_header", SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta()));
153 source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta()));
154 source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta()));
155 source.addMetaData("sounding_name_header", SInfoResultType.soundingLabel.getPdfHeader(this.context.getMeta()));
156 source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta()));
308 } 157 }
158
159 @Override
160 protected void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final RESULTS results) {
161
162 source.addMetaData("header", msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL));
163 source.addMetaData("calcMode", results.getCalcModeLabel());
164
165 source.addMetaData("version_label", msg(I18NStrings.CSV_META_VERSION_LABEL));
166 source.addMetaData("version", FLYS.VERSION);
167
168 source.addMetaData("user_label", msg(I18NStrings.CSV_META_USER_LABEL));
169 source.addMetaData("user", results.getUser());
170
171 final Locale locale = Resources.getLocale(this.context.getMeta());
172 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
173 source.addMetaData("date_label", msg(I18NStrings.CSV_META_CREATION_LABEL));
174 source.addMetaData("date", df.format(new Date()));
175
176 /* column headings */
177 source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta()));
178 }
179
309 } 180 }

http://dive4elements.wald.intevation.org